我有一个许多指针指向的对象。他们经常尝试访问数据。但是,在某些时候,此对象可能会被销毁。如何在销毁对象后立即有效地更新这些指针,以便它们不会指向未分配的内存并导致未定义的行为?
我的想法是列出需要更新以nullptr
的指针。这将在对象的析构函数中调用。丑陋的混乱和可能被分配的每一件事的大量工作。
也许这些智能指针对于此类情况有一些用处(从未使用过它们)。C++程序员如何处理这样的事情?
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;
}
}
丑陋的混乱和可能被释放的每一件事的大量工作
好吧,不要在析构函数中进行清理。创建一个单独的函数并在析构函数中调用它。可以从其他对象的析构函数调用此通用清理函数。