c++ - 共享指针双重删除

标签 c++ shared-ptr

我有一个对象,尽管它被智能指针跟踪,但显然被双重删除了。我不熟悉使用智能指针,所以我创建了一个简单的函数来测试我是否正确使用了该对象。

int *a = new int(2);

std::shared_ptr<int> b(a);
std::shared_ptr<int> c(a);

当指针超出范围时,主函数中的这组代码会导致运行时错误,为什么?智能指针不是应该能够自己处理 a 的删除吗?

最佳答案

shared_ptr 期望拥有指向的对象。

您所做的是创建两个 独立的智能指针,每个智能指针都认为它拥有底层 int 的独占所有权。他们不知道彼此的存在,他们不互相交谈。因此,当它们超出范围时,两个指针都会删除底层资源,结果显而易见。

当您创建一个shared_ptr 时,它会创建一种负责资源生命周期的“管理对象”。当您复制 shared_ptr 时,两个拷贝都引用相同的管理对象。管理对象跟踪有多少 shared_ptr 实例指向该资源。 int* 本身没有这样的“管理对象”,因此复制它不会跟踪引用。

这里是对代码的最小重写:

// incidentally, "make_shared" is the best way to do this, but I'll leave your
// original code intact for now.
int *a = new int(2);

std::shared_ptr<int> b(a);
std::shared_ptr<int> c = b;

现在,它们都引用相同的底层管理对象。随着每个 shared_ptr 被销毁,对 int* 的引用数量减少,当最后一个引用结束时,对象被删除。

关于c++ - 共享指针双重删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23673577/

相关文章:

c++ - 为什么 C++ 不允许您请求指向最派生类的指针?

c++ - libzip : what is the first argument? 中的 zip_source_zip

c++ - fwrite 和 write 之间的主要区别是什么?

c++ - 如果继承不是公开的而不是出错,为什么 enable_shared_from_this 会崩溃

c++ - 共享指针的循环依赖

c++ - 此线程清理警告中的竞赛在哪里?

c++ - 将 char[] 转换为 off_t

c++ - 这个右值签名模式有意义吗?

c++ - 类存在和引用计数管理

c++ - 使用 gdb 检查 boost shared_ptr