为什么 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();
}
代码分析说:
- C26432:如果定义或删除类型
class CPTSDatabase
中的任何默认操作,则全部定义或删除它们(c.21)。
我已阅读此内容,但看不到问题所在。我有构造函数和析构函数,我从不使用 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::mutex
或 std::atomic
),那么您也应该删除它们。
CPTSDatabase();
CPTSDatabase(CPTSDatabase&&) = delete;
CPTSDatabase& operator= (CPTSDatabase&&) = delete;
CPTSDatabase(CPTSDatabase const&) = delete;
CPTSDatabase& operator=(CPTSDatabase const&) = delete;
virtual ~CPTSDatabase();
请记住,删除这些基本操作会使您的 class 在使用方式上受到更多限制,但这比您的 class 以破坏它的方式使用要好。
在我的头文件中我有:
CPTSDatabase();
virtual ~CPTSDatabase();
void CloseDatabase();
在我的源文件中我有:
CPTSDatabase::~CPTSDatabase()
{
CloseDatabase();
}
void CPTSDatabase::CloseDatabase()
{
if (m_dbDatabase.IsOpen())
m_dbDatabase.Close();
}
代码分析说:
- C26432:如果定义或删除类型
class CPTSDatabase
中的任何默认操作,则全部定义或删除它们(c.21)。
我已阅读此内容,但看不到问题所在。我有构造函数和析构函数,我从不使用 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::mutex
或 std::atomic
),那么您也应该删除它们。
CPTSDatabase();
CPTSDatabase(CPTSDatabase&&) = delete;
CPTSDatabase& operator= (CPTSDatabase&&) = delete;
CPTSDatabase(CPTSDatabase const&) = delete;
CPTSDatabase& operator=(CPTSDatabase const&) = delete;
virtual ~CPTSDatabase();
请记住,删除这些基本操作会使您的 class 在使用方式上受到更多限制,但这比您的 class 以破坏它的方式使用要好。