創(chuàng)建類的對象的時候沒有用智能指針包裹,而是直接new的裸指針磁浇。
enable_from_this 的使用與實現(xiàn)原理說明:
shared_from_this()
是enable_shared_from_this<T>
的成員函數(shù)恨诱,返回shared_ptr<T>;
注意的是,這個函數(shù)僅在shared_ptr<T>的構(gòu)造函數(shù)被調(diào)用之后才能使用刑峡。
原因是enable_shared_from_this::weak_ptr并不在構(gòu)造函數(shù)中設(shè)置刻肄,而是在shared_ptr<T>的構(gòu)造函數(shù)中設(shè)置吻氧。
錯誤代碼:
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <iostream>
using namespace std;
class D: public boost::enable_shared_from_this<D>
{
public:
D()
{
cout<<"D::D()"<<endl;
}
void func()
{
cout<<"D::func()"<<endl;
boost::shared_ptr<D> p = shared_from_this();
}
};
int main()
{
D d;
d.func();
return 0;
}
失敗原因分析:
在主函數(shù)main中溺忧,D的實例是在棧上構(gòu)造,沒有使用boost::shared_ptr<D>
的構(gòu)造方式盯孙,
所以boost::enable_shared_from_this<D>
中的weak_ptr所指的函數(shù)對象也就沒有被賦值鲁森,
在調(diào)用d.func()
中使用shared_from_this()
函數(shù)時
----注:shared_from_this的函數(shù)實現(xiàn) ------
shared_ptr<T> shared_from_this()
{
shared_ptr<T> p( weak_this_ );
BOOST_ASSERT( p.get() == this );
return p;
}
----注:shared_from_this的函數(shù)實現(xiàn) ------
調(diào)用BOOST_ASSERT( p.get() == this );
失敗,拋出以上異常振惰。