【问题标题】:Why is VS flagging C26432 for my destructor?为什么 VS 为我的析构函数标记 C26432?
【发布时间】: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


【解决方案1】:

首先,请记住,包括 C26432 在内的一些 /analyze 警告是信息性的和可选的。如果您不想启用特定的 C++ 核心指南检查,您可以禁用它。见Microsoft Docs

它真正告诉你的是“嘿,你有没有想过你想如何为你的班级处理复制或移动?”

一般建议是,如果您定义了一个 dtor,那么您应该处理复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符。例如,您的类可以支持移动操作,但复制操作似乎是合乎逻辑的,因为它拥有系统资源(某种数据库句柄),因此您可能应该这样做:

CPTSDatabase();

CPTSDatabase(CPTSDatabase&&) = default;
CPTSDatabase& operator= (CPTSDatabase&&) = default;

CPTSDatabase(CPTSDatabase const&) = delete;
CPTSDatabase& operator=(CPTSDatabase const&) = delete;

virtual ~CPTSDatabase();

也就是说,如果您的类本身包含不支持移动的变量(例如 std::mutexstd::atomic),那么您也应该删除它们。

CPTSDatabase();

CPTSDatabase(CPTSDatabase&&) = delete;
CPTSDatabase& operator= (CPTSDatabase&&) = delete;

CPTSDatabase(CPTSDatabase const&) = delete;
CPTSDatabase& operator=(CPTSDatabase const&) = delete;

virtual ~CPTSDatabase();

请记住,删除这些基本操作会使您的课程在使用方式上受到更多限制,但它比您的课程以破坏它的方式使用要好。

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多