我有一个很多指针指向的对象。他们经常尝试访问数据。但是,此对象有时可能会被破坏。销毁对象后如何立即有效地更新这些指针,以使它们不会指向未分配的内存并导致未定义的行为?
我的想法是列出需要更新为nullptr
的指针的列表。这将在对象的析构函数中调用。令人头疼的混乱局面以及可能会释放的每件事的繁琐工作。
在此类情况下,智能指针可能会有一些用处(从未使用过)。 C ++程序员如何处理类似的事情?
答案 0 :(得分:3)
您只需要使用std::shared_ptr和std::weak_ptr。
shared_ptr
非常聪明,您无需删除它们,当没人再引用它们时,它们将被删除。然后,与此weak_ptr
相关的任何shared_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;
}
}
答案 1 :(得分:0)
一团糟,可能为每一个可能被释放的东西做很多工作
不要在析构函数中进行清理。创建一个单独的函数,然后在析构函数中调用它。您可以从其他对象的析构函数中调用此公共清理函数。