Jes*_*ood 6 c++ singleton destructor c++11
我正在阅读C++ 11常见问题并注意到这一点:
Run Code Online (Sandbox Code Playgroud)class X4 { ~X4() = delete; // Disallow destruction }这隐含地也不允许移动X4.允许复制,但已弃用.
我也找到了这个引用.
删除析构函数的定义将需要在free-store上进行分配,因为静态和自动对象隐式调用析构函数:
Run Code Online (Sandbox Code Playgroud)struct C { ~C()= delete; //prevent automatic and static objects };但是,这种技术没有看起来那么有用,因为它也可以防止删除表达式.但是Singleton对象可以使用它
这是有道理的.我的问题是,它是否被认为是一个具有明确删除的析构函数的Singleton的好习惯?此外,如果有人知道任何其他情况,你不应该打电话delete,请告诉我.
实际上,您有时可能会发现自己处于销毁特定类型对象不安全的情况。因此,您需要删除析构函数以防止任何人尝试。
对于单例来说,该类型永远只有一个实例,与大量实例未清理相比,未能销毁它的危害可能要小一些。
单例(或任何其他全局可用的对象)的问题之一是您可能会失去对它们的依赖项的控制。那么很难制定出安全的销毁顺序 - 如果全局数据库对象记录到您已安全关闭连接的全局记录器对象,但可选地全局记录器对象通过全局数据库对象将其记录到数据库,那么你就有问题了。
尽管您可能通过不破坏全局数据库对象来“解决”这个问题,但我认为这不应该真正被称为“良好实践”。这听起来更像是一种无需重新设计即可处理不良情况的简单方法(尽管在我的示例中,重新设计也可能非常简单 - 只需确保数据库记录器或数据库本身对日志消息执行一些有用的操作即可)当连接关闭时。吞掉它们,或将它们重定向到另一个可用的目的地)。
可能存在“好的”设计,其中特定类型的对象不能被破坏,但这不是 C++ 类的通常设计方式。