代码之家  ›  专栏  ›  技术社区  ›  Andrew Truckle

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

  •  0
  • Andrew Truckle  · 技术社区  · 3 年前

    在我的头文件中,我有:

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

    在我的源文件中,我有:

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

    代码分析是这样说的:

    • C26432 :如果在类型中定义或删除任何默认操作 class CPTSDatabase ,定义或删除它们(c.21)。

    我已经读过了,但看不出问题所在。我有一个构造函数和析构函数,我从不使用“删除”这个词。我错过了什么?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Chuck Walbourn    3 年前

    首先,记住其中一些 /analyze 包括C26432在内的警告具有信息性和可选性。如果不希望启用特定的C++核心指南检查,则可以禁用它。看见 Microsoft Docs

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

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

    CPTSDatabase();
    
    CPTSDatabase(CPTSDatabase&&) = default;
    CPTSDatabase& operator= (CPTSDatabase&&) = default;
    
    CPTSDatabase(CPTSDatabase const&) = delete;
    CPTSDatabase& operator=(CPTSDatabase const&) = delete;
    
    virtual ~CPTSDatabase();
    

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

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

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