如何删除动态分配对象的智能指针?

时间:2017-09-23 18:44:27

标签: c++ memory-management shared-ptr smart-pointers

我创建了一个迭代器,当解除引用时返回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 recorddelete *recordrecord.reset(),但这些都不会编译。

2 个答案:

答案 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并不