class Base{
public:
Base(object* pValue){
try{
//TODO
}
catch(exception){
m_pValue.release();
}
}
~Base();
private: shared_ptr<object> m_pValue;
};
在ctor中抛异常的时候例如
</pre><span style="font-size:18px"></span><p></p><p><span style="font-size:18px"> 这里使用了ctor中的exception</span></p><p><span style="font-size:18px"></span></p><p><span style="font-size:18px"> 这里值得注意是在ctor中如果抛出异常话,那么就不会调用dctor,那么就需要在异常里面直接对所建的对象进行析构, 这里不该称之为是对象因为一个完整的对象没有构建完,所以只能算是半个对象,那么析构掉它;</span></p><p><span style="font-size:18px"></span></p><p><span style="font-size:18px"></span></p><p><span style="font-size:18px"> 如果在dctor中使用exception的话例子如下</span></p><p><span style="font-size:18px"></span></p><pre name="code" class="cpp"><pre name="code" class="cpp">template<typename M>
class Base{
public:Base(){};
~Base(){
try{
logCreateBase()}
catch()
{
}
}
void logCreateBase();
private: shared_ptr<M> p_mVlaue;
};
其实这里的代码段在析构的时候保证了无忧;
如果logCreateBase代码段出现了exception那么就会在这里捕获异常,但是如果你在这里没有做exception的话,那么就会出现内存泄露,因为你的dctor没有完全执行完,所以你的对象没有完全析构掉,必然出现内存泄露;
现在看来看More Effective 真是本好书,,,,
但是里面有一节,中还在使用auto_ptr我感觉这个smart_pointer一般还是不要在single thread 中一般使用shared_ptr或者使用scoped_ptr这个指针不错,尽量减少auto_ptr的使用是明智的、