為什麼 VS 為我的析構函數標記 C26432?

安德魯·特拉克爾

在我的頭文件中,我有:

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

在我的源文件中,我有:

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

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

代碼分析是這樣說的:

  • C26432:如果您在 type 中定義或刪除任何默認操作,class CPTSDatabase請將它們全部定義或刪除 (c.21)。

我已經閱讀了這個,但看不到這個問題。我有一個構造函數和析構函數,我從不使用 delete` 這個詞。我錯過了什麼?

查克·沃爾伯恩

首先,請記住,/analyze包括 C26432 在內的一些警告是信息性的和可選的。如果您不想啟用特定的 C++ 核心指南檢查,您可以禁用它。請參閱Microsoft 文檔

它真正告訴你的是“嘿,你有沒有想過要如何為你的班級處理複製或移動?”

一般建議是,如果您定義了 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();

請記住,刪除這些基本操作會使您的類在如何使用它方面受到更多限制,但這比以破壞它的方式使用您的類要好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C vs C++ 為什麼這個宏沒有擴展為常量?

為什麼我的 C 數組會記住之前函數調用的舊數據?

C++ 結構和函數聲明。為什麼不編譯?

為什麼我在 C 中的 main 函數只打印第一個 for 循環?

為什麼我的函數返回 0.0?(C 代碼)

為什麼我的 C 函數不打印任何東西?

為什麼 Oracle 轉換函數將帶重音的“e”轉換為“c”?

為什麼 !+[]+[]+![] 是“真假”?

為什麼 pow 函數會減少 C 中循環的長度

為什麼 C 允許返回與函數返回類型不同的類型?

為什麼此多播 Deligation 不適用於 C# 中的函數?

為什麼我不能在函數中設置我的構造函數?

為什麼我的 C 代碼可以在終端中運行,而不是在使用 Code Runner 的 VS Code 中運行?

為什麼我的 C 結構在輸入中沒有得到任何數據?

為什麼我的函數在 componentDidMount 之前運行

為什麼我的函數 encodeChar 不起作用?

為什麼我的 javascript reduce 函數被跳過了?

我應該如何在 C++ 中為 Node 類定義析構函數?

為什麼我應該更喜歡單獨的函數而不是 C++ 中的函數式編程的靜態方法?

為什麼 NumberOfMessagesDeleted > NumberOfMessagesSent

使用 Visual Studio 以 Windows XP 為目標的最新 C++ 標準是什麼?

為什麼我們需要在從 C 中的函數分配返回值之前聲明變量數據類型?

為什麼 C 不將字符串存儲為字符的鍊錶?

為什麼 C# .Net Framework Web Form Application 沒有 Main 函數,或者 Program.cs

為什麼“文本”沒有作為 VS Code 中背景剪輯的選項出現?

在非靜態構造函數中設置靜態字段 | 為什麼這樣做?| C#

當複制構造函數在 C++ 中不可用時,為什麼不調用複制賦值運算符?

為什麼得到____不能為空

為什麼最小可能的整數減一成為 c 中最大可能的整數