提问人:Salvankar 提问时间:2/11/2022 最后编辑:273KSalvankar 更新时间:3/30/2022 访问量:135
关于析构函数的 QAC 警告
QAC Warning regarding destructor
问:
我在下面定义了一个类,其中删除了复制构造函数和赋值运算符。QAC 抛出警告“此类已声明默认或删除了特殊成员,但没有析构函数”。为什么会出现警告以及如何解决?
class A
{
public:
static A& getInstance()
{
static A AInstance;
return AInstance;
}
A(A const&) = delete;
void operator=(A const&) = delete;
private:
A();
};
答:
1赞
Sonic78
3/30/2022
#1
链接器警告显示问题所在:
在函数 A::A()' 中
A::getInstance()': <source>:8: undefined reference to
解决方法很简单:
class A
{
public:
static A& getInstance()
{
static A AInstance;
return AInstance;
}
A(A const&) = delete;
A& operator=(A const&) = delete; //< fix 2
private:
A() = default; //< fix 1 (C++11)
};
修复 1:提供定义(让编译器使用“=default”或使用 {} 表示旧的 C++)
修复 2:查看 https://en.cppreference.com/w/cpp/language/copy_assignment
修复 3:(如果要使其显式)同时删除移动构造函数和移动赋值运算符。
笔记:
- 使用具有静态存储持续时间的单例/变量时要小心:特别是当另一个对象的析构函数可能使用单例时。C++常见问题解答解释了原因:https://isocpp.org/wiki/faq/ctors#construct-on-first-use-v2(静态取消初始化顺序惨败)。
- 由于问题是关于QAC和静态代码分析的:也看看
- https://wiki.sei.cmu.edu/confluence/display/cplusplus/DCL56-CPP.+Avoid+cycles+during+initialization+of+static+objects 和
- https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#i3-avoid-singletons
上一个:析构函数在 C++ 中测试深层/浅层复制时无法解释的行为
下一个:默认复制构造函数
评论
~A() = default;
?