#include#include #include #include #include using namespace std; using namespace boost; class test{ public: void show(){ shared_ptr one(this);//###1###带此符号的两处shared_ptr非同源会造成:这里的shared_ptr退出作用后就将管理的对象进行析构,而外层的shared_ptr对此全然不知,继续使用该对象,麻烦就来了... cout<<"show()"< one(new test);//###1### one->show(); shared_ptr two=one;//拷贝一个shared_ptr two->show(); return 0; }
程序输出:
show()
~test
show()
~test //同一对象析构了两次
*** glibc detected *** ./two_shared_ptr_1: double free or corruption (fasttop): 0x000000000080b010 *** //double free
采用继承enable_shared_from_this,然后使用shared_from_this()可以解决这个问题
#include#include #include #include #include using namespace std; using namespace boost; class test:public enable_shared_from_this {//继承 public: void show(){ shared_ptr one(shared_from_this());//采用shared_from_this()的shared_ptr是同源的 cout<<"show()"< one(new test); one->show(); shared_ptr two=one; two->show(); return 0; }
程序输出:
show()
show()
~test //正常析构