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