为什么Visual Studio会为我的C++类析构函数标记C26432警告?
C26432警告问题解答
该警告对应C++核心准则的C.21规则,也就是常说的五法则:如果类显式定义/删除了析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符中的任意一个,必须对这5个特殊成员函数全部做显式处理,要么自定义实现,要么用=delete显式删除,要么用=default显式声明使用编译器默认实现,不能放任编译器隐式生成。
触发警告的原因
你已经显式定义了类的虚析构函数以及默认构造函数,但是剩下4个特殊成员函数没有做任何显式声明:
- 拷贝构造函数:
CPTSDatabase(const CPTSDatabase&) - 拷贝赋值运算符:
CPTSDatabase& operator=(const CPTSDatabase&) - 移动构造函数:
CPTSDatabase(CPTSDatabase&&) - 移动赋值运算符:
CPTSDatabase& operator=(CPTSDatabase&&)
这个规则的设计初衷是:只要类需要自定义析构函数,说明类持有需要手动管理的资源(你这里就是数据库连接对象m_dbDatabase),如果使用编译器隐式生成的拷贝/移动逻辑,大概率会出现资源重复释放、对象切割、悬空引用等问题,比如两个拷贝后的对象同时持有同一个数据库连接,析构时会重复调用关闭逻辑引发异常。
解决方案
根据你的业务场景选择对应处理方式即可:
- 如果你不允许该类对象被拷贝/移动(多数情况下该类作为基类使用,禁止拷贝可以避免对象切割问题),直接在头文件的类定义中显式删除这四个函数即可:
CPTSDatabase(const CPTSDatabase&) = delete; CPTSDatabase& operator=(const CPTSDatabase&) = delete; CPTSDatabase(CPTSDatabase&&) = delete; CPTSDatabase& operator=(CPTSDatabase&&) = delete;
- 如果你需要支持移动语义、不需要拷贝:删除拷贝相关函数,显式声明使用默认移动实现:
CPTSDatabase(const CPTSDatabase&) = delete; CPTSDatabase& operator=(const CPTSDatabase&) = delete; CPTSDatabase(CPTSDatabase&&) = default; CPTSDatabase& operator=(CPTSDatabase&&) = default;
- 如果你确实需要支持对象拷贝:自行实现拷贝构造和拷贝赋值的逻辑,处理数据库连接的拷贝规则(比如新建独立连接、加引用计数等)。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

