我有一个类,它持有一个析构函数可能会抛出异常的对象(实际上是一个tbb::task_group,但为了简单起见,我在这里将其命名为MyObject)。
代码如下:
#include <stdexcept>
class MyObject {
public:
MyObject() {}
~MyObject() noexcept(false) {}
};
class A {
public:
A() {}
virtual ~A() {}
};
class B : public A {
public:
B() : A() {}
~B() {}
private:
MyObject _object;
};
编译器会给出以下错误提示:
覆盖函数的异常规范比基类版本更宽松
我不喜欢在整个代码中散布着 noexcept(false) ,所以我考虑使用 MyObject 的原始指针,并在析构函数之外删除它们(例如,在 Close 函数中)。
如何处理这种情况最好呢?
try catch
块中,或者至少将析构函数设置为 noexcept(如果调用异常,则可能会调用std::terminate()
)。关于成员和基类的析构函数...它们也应该是 noexcept 的。;-) - Scheff's Catunique_ptr
的析构函数要求删除器的应用不会抛出异常:https://en.cppreference.com/w/cpp/memory/unique_ptr/~unique_ptr。您需要使用一个自定义的删除器来忽略异常。或者,使用一个原始指针。或者,只使用手动生命周期管理的 _aligned storage_(如果您想避免动态分配的过度死亡,这在这里可能不是必要的)。 - Daniel Langrnoexcept(false)
。B的析构函数也应该是noexcept(false)
。 - Bernd