以下程序崩溃时出现错误的glibc双重自由错误:
#include <iostream>
#include <memory>
class foo {
public:
foo()
{
std::cout << "foo constructed" << std::endl;
}
~foo()
{
std::cout << "foo destructed" << std::endl;
}
};
int main() {
auto f = std::make_shared< foo >();
std::cout << "Before reset" << std::endl;
f.reset( f.get() );
std::cout << "After reset" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从这里我得到以下输出(后跟glibc错误):
foo constructed
Before reset
foo destructed
After reset
foo destructed
Run Code Online (Sandbox Code Playgroud)
很明显,在这种情况下,对象被销毁两次.一旦通过重置和一次std::shared_ptr超出范围.这实际上是我所期待的.
但是在cppreference上我找到了以下文本(可在http://en.cppreference.com/w/cpp/memory/shared_ptr/reset找到):
如果*这已经拥有一个对象并且它是拥有它的最后一个shared_ptr,则该对象将通过拥有的删除器销毁,除非ptr是指向它的指针.
在我看来,这实际上说,对象不应该像我的例子那样被销毁.相当令人惊讶,但如果标准这样说.我是以某种方式误读了这个,还是std::shared_ptr我的实施不符合标准?
对于那些问我为什么这样做的人:
我目前正在试图弄清楚如何临时管理由 …