首页 > 解决方案 > 指向已销毁类失效的指针

问题描述

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

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

对于这些情况(从未使用过),这些智能指针可能有一些用途。C++ 程序员如何处理这样的事情?

标签: c++objectpointersmemory-management

解决方案


您只需要使用std::shared_ptrstd::weak_ptr

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

当它需要它时,它weak_ptr会尝试lock()创建一个本地shared_ptr. 如果原始指针被删除shared_ptrlock()将无法创建本地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;
    }
}

推荐阅读