为什么 VS 为我的析构函数标记 C26432?

Why is VS flagging C26432 for my destructor?

在我的头文件中我有:

CPTSDatabase();
virtual ~CPTSDatabase();
void    CloseDatabase();

在我的源文件中我有:

CPTSDatabase::~CPTSDatabase()
{
    CloseDatabase();
}

void CPTSDatabase::CloseDatabase()
{
    if (m_dbDatabase.IsOpen())
        m_dbDatabase.Close();
}

代码分析说:

我已阅读此内容,但看不到问题所在。我有构造函数和析构函数,我从不使用 delete 这个词。我错过了什么?

首先,请记住其中一些 /analyze 警告(包括 C26432)是信息性的和可选的。如果您不想启用特定的 C++ Core Guidelines 检查,您可以禁用它。参见 Microsoft Docs

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

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

CPTSDatabase();

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

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

virtual ~CPTSDatabase();

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

CPTSDatabase();

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

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

virtual ~CPTSDatabase();

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