指向已销毁类失效的指针



我有一个许多指针指向的对象。他们经常尝试访问数据。但是,在某些时候,此对象可能会被销毁。如何在销毁对象后立即有效地更新这些指针,以便它们不会指向未分配的内存并导致未定义的行为?

我的想法是列出需要更新以nullptr的指针。这将在对象的析构函数中调用。丑陋的混乱和可能被分配的每一件事的大量工作。

也许这些智能指针对于此类情况有一些用处(从未使用过它们)。C++程序员如何处理这样的事情?

你只需要使用 std::

shared_ptr 和 std::weak_ptr。

shared_ptr非常聪明,你不需要删除它们,当没有人再引用它们时,它们就会被删除。然后,与此shared_ptr相关的任何weak_ptr都将收到通知,并且它没有访问未分配内存的风险。

当需要它时,weak_ptr将尝试lock()并创建一个本地shared_ptr。如果删除了原始shared_ptr指针,lock()将无法创建本地shared_ptr并且您将安全地知道原始指针已删除。

// Example program
#include <iostream>
#include <assert.h>
#include <memory>
int main()
{
    std::shared_ptr<int> pI( new int(3) );
    std::weak_ptr<int> wI( pI );
    {
        // check if weak_ptr still "points" to some valid data:
        std::shared_ptr<int> pICopy = wI.lock();
        assert( pICopy != NULL );
        std::cout << "pI still valid " << *pICopy << std::endl;
    }
    pI.reset(); // this is equivalent to regular delete with shared_ptr
    {
        // check if weak_ptr does not "point" to any valid data:
        std::shared_ptr<int> pICopy = wI.lock();
        assert( pICopy == NULL );
        std::cout << "pI not valid anyore" << std::endl;
    }
}

丑陋的混乱和可能被释放的每一件事的大量工作

好吧,不要在析构函数中进行清理。创建一个单独的函数并在析构函数中调用它。可以从其他对象的析构函数调用此通用清理函数。

最新更新