gpt4 book ai didi

c++ - 如何在异常时不从构造函数调用基类析构函数?

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:41 24 4
gpt4 key购买 nike

我有一些类 Daughter1Daughter2 继承自 Mother:

class   Mother
{
public:
Mother(); // Empty constructor.
virtual ~Mother(); // Delete common daughter's stuff.

protected:
// Common stuff of each daughter.
};

每个女儿类共同的东东,删除方法都是一样的,所以妈妈做主。然而,它们的初始化是不一样的,所以它们在各自女儿的构造函数中:

class   Daughter1 : public Mother
{
public:
Daughter1(); // Initialize mother's stuff
~Daughter1();
};

class Daughter2 : public Mother
{
public:
Daughter2(); // Initialize mother's stuff in a different way than Daughter1
~Daughter2();
};

问题是:有时,子构造函数可能无法加载其内容并抛出异常。当我这样声明一个 Daughter 时:

Daughter1   daughter;

并且构造函数抛出一个异常,它调用了母亲的析构函数,它试图在没有初始化的情况下删除它的东西,这不可避免地导致了段错误。

避免这种麻烦的最好方法是什么?


我的大部分东西都是由指针组成的,所以我知道我可以简单地将它们初始化为母构造函数中的 nullptr 并在尝试在析构函数中删除之前检查它们,但它只适用于指针我正在寻找一个全局解决方案。

最佳答案

你不应该在你的 Mother 析构函数中删除未初始化的指针 - 只需将指针更改为智能指针,例如std::unique_ptr 并且只有在需要时它们才会删除自己。

更一般地说,~Mother 仅在Mother 基类完成构造时调用,然后每个成员变量应处于任何析构函数都可以安全运行的状态。对于像 doubleint 这样的类型,没有什么可以破坏的,所以不需要做任何事情。使用智能指针而不是原始指针,或使用标准容器/std::string 而不是您自己的 hackery。更一般地说,寻找或制作遵循 RAII 的类(class)确保他们正确清洁自己的原则。

simply initialize them to nullptr in the mother constructor and check them before trying a deletion in the destructor

FWIW,在delete 之前没有必要检查它们... nullptrdelete 是(安全的)空操作。换句话说,当指针不是 nullptr 时,您添加的任何检查都是多余的并且可能会浪费时间。

关于c++ - 如何在异常时不从构造函数调用基类析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32774304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com