【问题标题】:Raw pointer management原始指针管理
【发布时间】:2013-04-25 01:41:38
【问题描述】:

类在“create”方法中返回原始指针并在其“destroy”方法中获取原始指针参数是否合适?上述类将指针存储在容器中,并通过destroy方法查找/删除指定的对象。

或者我应该使用智能指针吗?如果我理解正确,智能指针表示所有权,但该类单独负责对象的创建和销毁。

【问题讨论】:

  • 有人可能会争论,使用显式 destroy 成员函数而不是返回自动调用它的智能指针是否是个好主意。
  • 我不会推荐这种方法,因为这会违反 OO 的封装原则。在你的场景中,你不能有一个私有指针并将操作封装在类中
  • 管理类创建的对象需要在类外可访问。但是,无论范围如何,我都希望能够在不再需要该对象时删除它。

标签: c++ pointers


【解决方案1】:

问题是:您能否以编程方式描述代码应具有的获取/释放行为?如果是,即行为不是一系列没有任何模式的独特事件,那么您可以编写一个实现此行为的句柄类。更重要的是,这个句柄类将能够保证行为,这就是智能指针的全部意义所在。这不仅关乎代码的正确性,还关乎使编写正确代码更容易的扩展保证。

此外,智能指针并不总是指示所有权,尽管它们在大多数情况下都是如此。共享所有权 (shared_ptr) 和独占所有权 (auto_ptr, unique_ptr) 之间也有区别。然后,有例如没有所有权的纯粹参考 (weak_ptr)。

对我来说,听起来您可能想要返回一个带有相应删除器的 shared_ptr。然后,工厂可以例如保留一个weak_ptr 以保留对相应对象的一些访问,而shared_ptr 保证正确清理。不过,请确保您定期从工厂内部清除过期的 weak_ptrs。

在任何情况下我都不会返回原始指针。这带来的问题是:调用者完成后应该如何处理它?调用删除?调用一些特定的 destroy() 函数?这两者都可以通过智能指针更好地处理。此外,如果工厂保留所有权并保留随时丢弃对象的权利,那么持有原始指针的人如何得知该指针将变为无效这一事实?一个简单的答案是使用收到通知的智能指针,例如弱点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多