关于析构函数的 QAC 警告

QAC Warning regarding destructor

提问人:Salvankar 提问时间:2/11/2022 最后编辑:273KSalvankar 更新时间:3/30/2022 访问量:135

问:

我在下面定义了一个类,其中删除了复制构造函数和赋值运算符。QAC 抛出警告“此类已声明默认或删除了特殊成员,但没有析构函数”。为什么会出现警告以及如何解决?

class A
{
  public:
     static A& getInstance()
     {
        static A AInstance;
        return AInstance;
     }
     A(A const&) = delete;
     void operator=(A const&) = delete;
   private:
     A();
};
C++ 警告 析构函数 复制构造函数 QA-C

评论

0赞 Drew Dormann 2/11/2022
~A() = default;?

答:

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:(如果要使其显式)同时删除移动构造函数和移动赋值运算符。

笔记: