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

How to delete smart pointer to dynamically allocated object?

我制作了一个迭代器,当取消引用时 returns 指向动态分配的 std::pair 的副本 std::shared_ptr(在迭代器内部使用 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(),但其中 none 可以编译。

shared_ptr are designed to delete automatically the object they manage, once it is no longer needed. This happens when no shared pointer point anymore to the object (e.g. all the shared pointers pointing to the same object were deleted, or reset 指向另一个对象)。

不需要自己删除。按照设计,甚至没有办法自己直接删除对象,因为这可能会导致一些悬空指针和不一致。

unique_ptr是另一种智能指针。它们旨在保持分配对象的所有权,并在唯一指针本身被销毁时销毁该对象。

再说一遍,没有必要自己删除对象。 unique_ptr 的创建是为了让您免除这项职责。但是如果你愿意,你可以在这里通过 reseting 指针销毁托管对象。由于指针是唯一的,因此不存在在此处创建悬挂指针的风险。

最后还有weak_ptr。这些不拥有一个对象,而是指由一些 shared_ptr 管理的对象。这个想法是 weak_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 ;
        }
} ;

较新的 GCC,如 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 ) ;
}

但是 GCC 喜欢 4.0.x 不