相关疑难解决方法(0)

如果我将std :: shared_ptr重置为自身会发生什么

以下程序崩溃时出现错误的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我的实施不符合标准?

对于那些问我为什么这样做的人:

我目前正在试图弄清楚如何临时管理由 …

c++ shared-ptr c++11

5
推荐指数
1
解决办法
1741
查看次数

标签 统计

c++ ×1

c++11 ×1

shared-ptr ×1