1

我知道我可以声明一个析构函数=delete,或者private为了防止程序在范围末尾隐式删除对象。我也知道,如果它是私有的,我可以有一个成员函数,只要我调用它就可以显式调用析构函数:void kill() { this–>~A(); }

我的问题是:

  • 为什么我要防止隐式破坏?请举个例子

  • =delete做什么?它是否确保析构函数永远不会运行?那么该对象将永远存在于其范围之外吗?

4

1 回答 1

1

诸如私有析构函数之类的惯用语通常用于防止其他程序员对您的类型执行某些操作。私有析构函数尤其可以防止以下情况:

  • 在堆栈上声明您的实例类型
  • 通过 delete 关键字手动删除您的类型的实例
  • 手动析构函数调用

执行任何这些操作都会引发一个编译错误,该错误很难解决。该错误通常是作者向用户发送的一条消息,即他们不应执行这些操作中的一项或全部,而是作者可能希望他们执行以下操作:

  • 调用工厂函数来销毁这种类型的实例(通常与私有构造函数相结合)。当批处理操作比“一次性”分配更有效时,提供有关构造和销毁的额外上下文可以提供优化机会或防止 API 滥用。
  • 不分配这种类型的任何实例(可能是单例

考虑编写一个管理硬件接口的类型,允许用户简单地删除实例可能会使硬件处于不良状态 - 那么为什么还要允许它呢?是的,在某些时候,可以构建 API 以抽象出这个困难 - 但在某些基本级别上,需要公开“脆弱”功能。

=delete 是防止用户错误的“新”防弹方法。与私有复制构造函数不同,它不能通过 'friend' 关键字规避。它也倾向于更好地阅读,因为它以一致的方式告诉代码的用户此功能不可用。我的理解是 =delete 是在 c++11 中引入的,以替代“不复制/不删除习语”。

于 2013-09-17T02:37:47.077 回答