什么时候应该防止隐性破坏?它是如何工作的?

时间:2013-09-17 01:49:36

标签: c++ destructor explicit-destructor-call

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

我的问题是:

  • 为什么我要阻止隐式破坏?请举例

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

1 个答案:

答案 0 :(得分:1)

像私有析构函数这样的习惯用法通常用于阻止其他程序员使用您的类型执行某些操作。特别是私有析构函数会阻止以下内容:

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

执行上述任何操作都会引发编译错误,这对于解决这个问题并非易事。错误通常是从作者到用户的消息,他们不应该执行这些操作中的一个或全部,而是作者可能希望他们:

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

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

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