在我的构造函数中,如果其中包含任何代码,我必须销毁所有剩余资源。我想避免编写重复的代码,因此我只在catch块中调用析构函数即可释放所有已创建的资源。这样安全吗?
我知道如果构造函数抛出异常,则不会调用析构函数,因此我尝试在msvc中编译一些代码,但似乎没有什么错,但是我不确定这是否很幸运。
Object::Object(){
try{
// Initialize multiple resources here.
}catch(...){
this->~Object(); // Is this safe?
throw;
}
}
Object::~Object(){
// release multiple resources, if initialized.
}
尽管析构函数看起来像普通方法,而显式销毁语法看起来像是该方法的调用,但实际上并不仅仅是调用该方法。除其他特定于实现的内容外,它还调用基类和数据成员的析构函数。从构造函数中抛出异常也会导致所有这些析构函数被调用。因此,~Object()
随后throw
将给他们打电话两次,可能会带来灾难性的后果。
就像有人在注释中建议的那样,只需将清除代码移到普通方法即可。
使用函数调用语法构造一个临时函数以及new
/delete
和operator new
/也存在类似的句法问题operator delete
。即使看起来像他们一样,它们中没有一个只使用相同的名称调用函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句