c++ - 显式删除析构函数而不调用 delete

标签 c++ singleton c++11 destructor

我正在阅读 C++11 FAQ并注意到这一点:

class X4 {
    ~X4() = delete; // Disallow destruction
}

This implicitly also disallows moving of X4s. Copying is allowed, but deprecated.

我还找到了this quote .

Deleting the definition of a destructor will require allocation on the free-store because static and automatic objects implicitly invoke the destructor:`

struct C
{
    ~C()= delete; //prevent automatic and static objects
};

However, this technique is less useful than it may seem because it prevents delete expressions, too. Singleton objects can use it, though.`

这是有道理的。我的问题是,具有显式删除的析构函数的单例是否被认为是好的做法?此外,如果有人知道您不应该调用 delete 的任何其他情况,请告诉我。

最佳答案

实际上,有时您可能会发现自己处于销毁特定类型的对象是不安全的情况。所以你会删除析构函数以防止任何人尝试。

在 Singleton 的情况下,只有一个类型的实例,未能销毁它可能比有大量实例未清理的危害更小。

单例(或任何其他全局可用对象)的一个问题是您可能会失去对它们的依赖项的控制。那么就很难制定出安全的销毁顺序——如果全局数据库对象记录到全局记录器对象,则表明您已经安全地关闭了连接,但是可选地,全局记录器对象通过全局数据库对象将其记录到数据库中, 那么你就有问题了。

虽然您可以通过不破坏全局数据库对象来“解决”这个问题,但我认为这不应该真正称为“良好实践”。这听起来更像是一种无需重新设计即可处理糟糕情况的简单方法(尽管在我的示例中,重新设计也可能非常简单 - 只需确保数据库记录器或数据库本身对日志消息做一些有用的事情当连接关闭时。吞下它们,或将它们重定向到另一个可用的目的地)。

可能存在某些“好的”设计,其中特定类型的对象不能被销毁,但这不是 C++ 类的通常设计方式。

关于c++ - 显式删除析构函数而不调用 delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9091957/

相关文章:

c# - .Net OpenCV 包装器值得使用吗?

c++ - 在 C++ 中省略 void 作为函数结果

c++ - FSCTL_GET_RETRIEVAL_POINTERS 对小文件失败

spring - Spring Bean 的原型(prototype)是做什么用的?

c++ - 如何使用 C++11 原子库实现 seqlock 锁

c++ - 有没有办法防止 header 定义的 c++ 函数被视为内联

c# - 这个单例实现是线程安全的吗 - 检查代码

javascript - 单例模式的简单 JS 示例不起作用

c++ - 有没有一种简单/优雅的方法可以将整数范围推送到 STD vector ?

c++ - unique_ptr,移动构造函数,以及为什么总是尝试访问私有(private)成员