从构造函数中的catch块调用析构函数安全吗?

丹尼尔

在我的构造函数中,如果其中包含任何代码,我必须销毁所有剩余资源。我想避免编写重复的代码,因此我只在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/deleteoperator new/也存在类似的句法问题operator delete即使看起来像他们一样,它们中没有一个只使用相同的名称调用函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

什么时候可以安全地在构造函数和析构函数中调用this->

在C ++中从构造函数中显式地调用析构函数是不好的做法吗?

好坏:在构造函数中调用析构函数

向量中的匿名构造函数和析构函数调用

构造函数中引发了异常:调用了析构函数吗?

块范围静态的析构函数可以调用几次吗?

从析构函数中抛出异常对于vtable是安全的吗?

析构函数会自动在C ++中调用delete []吗?

根据C ++标准,显式调用构造函数和析构函数是否安全?

从子构造函数/析构函数调用纯虚函数

析构函数调用

当委托构造函数抛出时,析构函数会被调用吗?

显式调用基类的析构函数/构造函数合法吗?

复制构造函数和析构函数的奇怪调用

从默认构造函数调用的成员的析构函数

为什么析构函数比构造函数调用得更多?

当析构函数调用构造函数时会发生什么?

在模板类的构造函数末尾调用的模板的析构函数

析构函数中的析构函数?

此类的构造函数/析构函数有问题吗?

构造函数和析构函数必须是虚拟的吗?

C ++中的析构函数直接调用

析构函数在C ++中调用向量

带有向量的类构造函数中的析构函数调用

C++ 你能在构造函数或析构函数中引用 this 指针吗?

从析构函数调用非成员函数可以吗?

C ++中的析构函数和构造函数排序

为什么在构造时调用C ++类的析构函数?

C ++构造函数/析构函数调用&在动态创建的数据上调用“ new”会删除旧数据吗?