【问题标题】:Is it possible to create weak pointer for c style pointer or raw pointer in c++17是否可以在 c++17 中为 c 样式指针或原始指针创建弱指针
【发布时间】:2019-01-09 13:16:53
【问题描述】:

我有一个第三方库,里面有很多 c 风格的原始指针。现在我正在用 c++ 17 编写一个线程。我想将弱指针用于库的 c 样式指针。这个库可以被许多其他修改/删除相同指针的线程使用。如何实现?有什么设计模式可以提供帮助吗?

在图书馆:

struct table *table = (struct table *) malloc(sizeof(table));

现在在我的帖子中:

auto wp = std::make_weak<struct table* >(table)

【问题讨论】:

  • 为什么是弱指针?为什么不是共享指针?在您的应用程序中,也许您应该为库编写一个包装类(对库的所有访问都应该通过包装类,而不是直接通过)?
  • 弱指针无法保存原始指针。这就是弱ptr背后的全部想法。它只指向管理所有权和删除的不同类型的智能指针。
  • 也许您应该首先确定谁拥有指针与谁在引用指向的对象但实际上并不拥有指针和被指向的对象。请参阅 When is std::weak_ptr useful?shared_ptr and weak_ptr differences,因为这些问题的答案对指针所有权进行了一些有趣的讨论。
  • 考虑使用std::unique_ptr。仅在没有其他操作时使用std::shared_ptr + std::weak_ptr

标签: c++ c++17


【解决方案1】:

欠原始指针的致命问题之一是,没有您可以观察到 其他地方已使您的指针。智能指针通过跟踪谁知道对象来工作,并且仅在最后一个指针被销毁时才销毁。

std::weak_ptrstd::shared_ptr 的补充,仅此而已。它不会神奇地知道何时在它指向的对象上调用delete,它使用与std::shared_ptr 相同的机制来了解对象的生命周期。请注意,std::weak_ptr 没有接受原始指针的构造函数。

如果库管理所有权,则不正确将它们放入使用std::default_delete 的智能指针中。您可以做的最好的事情是使用库的 release 函数作为智能指针的删除器,并包装 create 函数以便返回这样的智能指针而不是原始指针。

【讨论】:

  • 术语:“当最后一个指针”最后一个所有者?最后shared_ptr?最后一个强大的参考?
  • @curiousguy 对于 std::shared_ptrstd::unique_ptr,最后一个拥有指针
  • OK ... 虽然既不是std::shared_ptr 也不是std::unique_ptr,它们是类。只有指针(标量)才是真正的指针。
  • @curiousguy 如果你要学究气,他们是模板。但它们是具有指针语义的类的模板,这足以进行口语讨论,尤其是在将限定符“原始指针”用于形状为 T* 的事物时
  • 不想成为“迂腐”,但这些所谓的“智能指针”甚至没有转换为真正的指针。 (此外,std::shared_ptr 的几乎所有实际用途都将用于模板的特化,这就是我提到类而不是模板的原因。)
猜你喜欢
  • 1970-01-01
  • 2019-08-25
  • 2020-01-18
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多