我什么时候应该避免破坏含蓄? 它是如何工作的?(When should I prevent im

2019-10-18 15:30发布

我知道我可以声明析构函数=deleteprivate以防止程序在范围结束隐含删除对象。 我也知道,如果是私人的,我可以有一个成员函数可以显式调用每当我把它叫做析构函数: void kill() { this–>~A(); } void kill() { this–>~A(); }

我的问题是:

  • 为什么我会永远想阻止破坏含蓄? 请举一个例子

  • 什么会=delete吗? 它确保析构函数永远不会运行? 因此,该对象将永远存在的范围之内?

Answer 1:

就像一个私人的析构函数成语一般用于防止其他程序员从您的类型来执行某些操作。 特别是私人析构函数阻止以下内容:

  • 在堆栈上一个类型的实例的宣言
  • 通过删除关键字的类型的实例的手动删除
  • 手动析构函数调用

做任何这些都将提升一个编译错误,是不平凡的解决。 该错误通常是从作者到用户,他们不应该执行一个或所有这些操作,而不是作者可能他们想要的消息:

  • 调用工厂函数来破坏这种类型的(典型地加上私有构造函数)的实例。 提供建设和破坏可以提供优化的机会或防止滥用API时,成批的操作是不是“一次性”的分配更加高效额外的上下文。
  • 不分配此类型的任何实例(也许这是一个单身 )

考虑编写管理的硬件接口,允许用户简单地删除实例可能离开硬件不希望的状态的类型 - 那为什么还要允许吗? 是的,在某些时候的API可以建立抽象掉这个难题 - 但在某些基层“脆弱”的功能需要暴露。

=删除是“新”防弹防止用户错误的方式。 不同于私人拷贝构造函数无法通过“朋友”关键字来规避。 它也往往读更好,因为它讲述的代码以一致的方式将用户,此功能不可用。 我的理解是,=删除在C ++ 11引入了“无复制/没有删除成语”的替代品。



文章来源: When should I prevent implicit destruction? How does it work?