【问题标题】:Is it dangerous to pass pointers to a class with private *tors?将指针传递给具有私有 *tors 的类是否危险?
【发布时间】:2011-11-25 02:50:06
【问题描述】:

如果我有一个带有私有构造函数和析构函数的类,将经典的 c 样式指针传递给实例(而不是 shared_ptr)是否仍然危险?是否存在内存可能泄漏的情况? 我的程序中实例的生命周期由友元工厂类专门管理(它还使用私有自定义删除器来允许管理器类在内部使用 shared_ptr 对象)。

【问题讨论】:

  • 不,一点也不。为什么传递指针会很危险?这就是他们的目的。 shared_ptr 无论如何都在内部使用原始指针。并且内存泄漏与构造函数的私有性或公共性无关。
  • @SethCarnegie 我在想,使用公共构造函数,客户端将能够实例化该类,并且传递普通指针而不是 shared_ptr 可能会泄漏内存。对于私有构造函数,这是不可能发生的。

标签: c++ pointers memory-leaks shared-ptr


【解决方案1】:

如果你已经有了指针,构造函数就完全不重要了。至于析构函数——如果你有一个私有的析构函数,你将无法使用delete,而且我相信这也会阻止你实例化shared_ptr(正如 dandrestor 指出的那样——除非你提供自定义删除函数,您不仅可以使用shared_ptr)。

所有限制都是在编译时施加的,因此如果您由于隐私问题未能释放内存,您将在编译时收到通知。

【讨论】:

  • 您认为正确:如果 dtor 是私有的,则必须调用它的 shared_ptr dtor 无法编译。
  • 其实你可以通过自定义deleter函数编译shared_ptr。见stackoverflow.com/questions/8202530/…
  • @EmilioGaravaglia,如果我们忘记了 dandrestor 的评论,我会说“我相信”,因为我非常谨慎地对我没有尝试过的事情发表声明——纯粹是理论上的 :)
  • @MichaelKrelin-hacker 运行时问题呢?我的理由是,由于构造和销毁是分开处理的,因此使用普通指针不会带来风险。你怎么看?
  • @MichaelKrelin-hacker 在我的程序中,自定义删除器是管理器类的静态私有方法,因此这限制了对管理器类的破坏。
猜你喜欢
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 2012-11-06
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多