- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一些类 Daughter1
和 Daughter2
继承自 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
基类完成构造时调用,然后每个成员变量应处于任何析构函数都可以安全运行的状态。对于像 double
和 int
这样的类型,没有什么可以破坏的,所以不需要做任何事情。使用智能指针而不是原始指针,或使用标准容器/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
之前没有必要检查它们... nullptr
的delete
是(安全的)空操作。换句话说,当指针不是 nullptr
时,您添加的任何检查都是多余的并且可能会浪费时间。
关于c++ - 如何在异常时不从构造函数调用基类析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32774304/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!