有多个不同源的shared_ptr管理对象时会出现多次释放对象,这里不同源是指多组间不是通过拷贝构造、复制等手段而来的,即几组shared_ptr是独立声明的。
#include<iostream> #include<pthread.h> #include<unistd.h> #include<boost/enable_shared_from_this.hpp> #include<boost/shared_ptr.hpp> using namespace std; using namespace boost; class test{ public: void show(){ shared_ptr<test> one(this);//###1###带此符号的两处shared_ptr非同源会造成:这里的shared_ptr退出作用后就将管理的对象进行析构,而外层的shared_ptr对此全然不知,继续使用该对象,麻烦就来了... cout<<"show()"<<endl; } ~test(){ cout<<"~test"<<endl; } }; int main(){ shared_ptr<test> one(new test);//###1### one->show(); shared_ptr<test> 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<iostream> #include<pthread.h> #include<unistd.h> #include<boost/enable_shared_from_this.hpp> #include<boost/shared_ptr.hpp> using namespace std; using namespace boost; class test:public enable_shared_from_this<test> {//继承 public: void show(){ shared_ptr<test> one(shared_from_this());//采用shared_from_this()的shared_ptr是同源的 cout<<"show()"<<endl; } ~test(){ cout<<"~test"<<endl; } }; int main(){ shared_ptr<test> one(new test); one->show(); shared_ptr<test> two=one; two->show(); return 0; }
程序输出:
show()
show()
~test //正常析构