为什么在Singleton类中使用私有析构函数?

pap*_*ane 4 c++ singleton

我已经看到构造函数,复制构造函数,析构函数和赋值运算符保存在典型的单一类中的私有范围内.例如

class CMySingleton
{
public:
  static CMySingleton& Instance()
  {
    static CMySingleton singleton;
    return singleton;
  }

private:
  CMySingleton() {}                                  // Private constructor
  ~CMySingleton() {}
  CMySingleton(const CMySingleton&);                 // Prevent copy-construction
  CMySingleton& operator=(const CMySingleton&);      // Prevent assignment
};
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是

为什么要将析构函数和赋值运算符保留在私有范围内呢?这是强制性的吗?

公共析构函数是否会破坏单例类的任何属性?因为我们的对象构造受到限制所以不会有不必要的破坏.

我可以理解私有赋值运算符可以阻止自我赋值,但是除了额外的运行时间之外,公共赋值运算符是否还会受到伤害?

Chr*_*rew 8

使析构函数私有可能会阻止某人尝试调用delete指向单例的指针.

auto& singleton = CMySingleton::Instance();
auto pointer_to_singleton = &singleton;
delete pointer_to_singleton;  // Bad!
Run Code Online (Sandbox Code Playgroud)

禁用赋值运算符可以防止无害但无意义的自我赋值.看到这个答案.如果有人这样做,很可能,这是一个错误,所以你不妨这样做.