c++ - 指向已销毁类失效的指针
问题描述
我有一个许多指针指向的对象。他们经常尝试访问数据。然而,在某些时候,这个对象可能会被破坏。如何在销毁对象后立即有效地更新这些指针,以免它们指向未分配的内存并导致未定义的行为?
我的想法是制作一个需要更新的指针列表nullptr
。这将在对象的析构函数中调用。丑陋的混乱和每件可能被释放的事情的大量工作。
对于这些情况(从未使用过),这些智能指针可能有一些用途。C++ 程序员如何处理这样的事情?
解决方案
您只需要使用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;
}
}
推荐阅读
- c# - 如何验证可以经常更改的条件
- scala - 了解 Y-Combinator 的实现
- asp.net - 嵌入 Power BI 仪表板问题
- javascript - Mocha/Chai 测试办公室插件,但 Mocha 一直声称“办公室”未定义?
- dart - Angular Dart 中的工具提示
- c - 我在 C 中使用 sscanf 和 fscanf 真的很难
- javascript - 如何在 .net framework mvc 项目中设置 JavaScript
- java - 任务 ':run' 执行失败。> Process 'command...finished with non-zero exit value 1
- javascript - 将十进制数的 JavaScript 字符串转换为数字而不丢失尾随零
- angular - Angular 6、ServiceWorker ios Safari 和 Video 元素字节范围请求