我制作了一个迭代器,当重新引入返回std::shared_ptr
的副本时,该副本指向动态分配的std::pair
(在迭代器内部中使用new
创建)。迭代器的功能原样,但希望在循环结束时释放pair
以防止内存泄漏。
for (auto it = parser.begin(); it != parser.end(); ++it) {
shared_ptr<pair<string, string>> record = *it;
// Analysis of pair
// delete pair with delete, or reset
}
但是,我在释放pair
方面遇到困难。我尝试过delete record
,delete *record
和record.reset()
,但是这些都不会编译。
shared_ptr
旨在自动删除其管理的对象,一旦不再需要。当不再共享指针指向对象时(例如,指向同一对象的所有共享指针均已删除或重置以指向另一个对象时,就会发生这种情况。
无需自己删除它。通过设计,甚至无法直接删除对象,因为这可能会导致一些悬空的指针和不一致之处。
unique_ptr
是另一种智能指针。它们旨在保留分配的对象的所有权,并在销毁独特的指针本身时销毁对象。
再次,无需自己删除对象。unique_ptr
的创建是为了释放您的职责。但是在这里,您可以通过重置指针来破坏托管对象。由于指针是独一无二的,因此在这里制作悬空的指针没有风险。
最后,还有 weak_ptr
。这些不拥有一个对象,而是参考某些shared_ptr
管理的对象。这个想法是,弱_ptr的存在并不能阻止删除对象。由于weak_ptr
不拥有对象,无论您做什么,它都无法删除它。
对于我的智能指针,该指针已删除了运算符,我使用
struct DeleteIt
{
template < typename T >
void operator() ( const T* ptr ) const
{
delete ptr ;
}
template < typename T >
void operator() ( const safeptr< T >& ptr ) const
{
delete &ptr ;
}
} ;
和7.3和8.2之类的较新的海湾合物
// this is okay for modern GCC
for ( std::vector< safeptr< Item > >::const_iterator it = items.begin () ; it != items.end () ; ++ it )
{
delete *it ;
}
// this works with any GCC
for ( std::vector< safeptr< Item > >::const_iterator it = items.begin () ; it != items.end () ; ++ it )
{
delete &( *it ) ;
}
但是,诸如4.0.x之类的gcc不