【发布时间】:2021-12-09 01:27:42
【问题描述】:
在我的头文件中,我有:
CPTSDatabase();
virtual ~CPTSDatabase();
void CloseDatabase();
在我的源文件中:
CPTSDatabase::~CPTSDatabase()
{
CloseDatabase();
}
void CPTSDatabase::CloseDatabase()
{
if (m_dbDatabase.IsOpen())
m_dbDatabase.Close();
}
代码分析在说:
-
C26432:如果您在
class CPTSDatabase类型中定义或删除任何默认操作,请全部定义或删除它们(c.21)。
我已阅读此内容,但看不到问题所在。我有一个构造函数和析构函数,我从不使用 delete` 这个词。我错过了什么?
【问题讨论】:
-
这是(隐式)具有
noexcept规范的析构函数:"[except.spec]/8 隐式声明的析构函数的异常规范,或没有的析构函数noexcept-specifier,当且仅当其任何潜在构造的子对象的任何析构函数都可能抛出时,才可能抛出。” -
C26432似乎抱怨rule-of-three 违规:您定义了析构函数,但没有定义复制构造函数或复制赋值运算符。复制CPTSDatabase的实例时会发生什么? -
@IgorTandetnik 我没有意识到这一点。我也没有意识到
noexcept可以有参数。我将noexcept(false)添加到标题/源中的析构函数中,这解决了第一个问题。我想我会做的是将这个问题改写为另一个问题,我们可以整理这些命令。 -
请注意,抛出的析构函数是really bad idea。析构函数默认为
noexcept是有原因的。 -
析构函数是进行清理的正确位置。如果你不能帮助它并且不得不从析构函数中调用函数,这些函数本身不是
noexcept,你需要将它们包装在try/catch中。
标签: visual-c++ mfc destructor code-analysis