多个非同源的shared_ptr管理对象引起double free

2014-11-24 01:02:47 · 作者: · 浏览: 4
有多个不同源的shared_ptr管理对象时会出现多次释放对象,这里不同源是指多组间不是通过拷贝构造、复制等手段而来的,即几组shared_ptr是独立声明的。
#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 //正常析构