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

How to delete smart pointer to dynamically allocated object?

本文关键字:对象 动态分配 智能 指针 用于 何删除 删除      更新时间:2023-10-16

我制作了一个迭代器,当重新引入返回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(),但是这些都不会编译。

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不