我创建了一个迭代器,当解除引用时返回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()
,但这些都不会编译。
答案 0 :(得分:4)
shared_ptr
旨在自动删除他们管理的对象,一旦不再需要。当没有共享指针指向对象时(例如,指向同一对象的所有共享指针都被删除,或reset指向另一个对象),就会发生这种情况。
无需自行删除。根据设计,甚至没有办法直接自己删除对象,因为这可能会导致一些悬空指针和不一致。
unique_ptr
是另一种智能指针。它们旨在保持已分配对象的所有权,并在唯一指针被自身销毁时销毁该对象。
同样,不需要自己删除对象。 unique_ptr的创建是为了让您免除此职责。但是在这里你可以通过reseting指针来销毁托管对象。由于指针是唯一的,因此不存在在此创建悬空指针的风险。
最后还有 weak_ptr
。它们不拥有对象,但引用由某些shared_ptr
管理的对象。我们的想法是,weak_ptr的存在并不会阻止删除该对象。由于weak_ptr
不拥有对象,因此无论您做什么,它都无法删除它。
答案 1 :(得分:0)
对于我的智能指针(操作符删除已重载),我使用
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等较新的GCC可以不使用&
进行删除// 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并不