【问题标题】:I can't understand weak pointers (C++) [closed]我无法理解弱指针(C++)[关闭]
【发布时间】:2020-07-31 05:39:12
【问题描述】:

我正在尝试了解一些关于std::weak_ptr(语义和用例)的知识,但是我在网上找不到很多资源。 Cppreference 没有太大帮助,还有一些其他网站,但它们也没有真正的帮助。

提前谢谢你!

【问题讨论】:

  • 你对他们有什么不了解?
  • @AlanBirtles 基本上没有。我知道当没有strong_ptr 指向它时,weak_ptr 指向的对象将被销毁,仅此而已。我真的找不到任何好的例子,什么时候使用它的语法(如何检查它指向的值是否仍然存在等)
  • 要知道的就这些?
  • 也许它应该得到一个真正的答案,但已经关闭。 weak_ptr 主要用于观察者或打破循环依赖。观察者希望能够打印对象的状态如果它仍在其他地方使用,并且只知道它不再被使用。 weak_ptr 允许对象被销毁。 lock 如果对象仍然存在,则从中提取 shared_ptr,如果对象已过期,则返回默认的 shared_ptr(实际上指向 NULL)。 cppreference std::weak_ptr.lock 包含代码示例...
  • ...另一个可能的用例是打破参考周期。如果 A 有一个指向 B、B 指向 C 和 C 指向 A 的共享指针,那么任何对象都不会被销毁,因为它们每个都有一个所有者。如果其中一个指针变弱,当不再需要对象时,weak_ptr 指向的指针将被销毁,并从那里销毁整个链。只需在使用之前从weak_ptrlock 获得一个临时的shared_ptr,就像观察者所做的那样。

标签: c++ smart-pointers weak-ptr


【解决方案1】:

它是对 shared_ptr 的非拥有引用,可以安全地升级到 shared_ptrweak_ptr 不常用。迄今为止从未使用过它。不过,部分原因是除非需要,否则我通常会回避shared_ptr

weak_ptr 可用于管理shared_ptr 的生命周期 - 这可能非常混乱。例如,如果一堆类实例有一个shared_ptr 的副本,你如何在需要时将其删除?检查每一个泄露它的实例,谁知道在哪里?

现在您可以持有一个 shared_ptr 并仅提供 weak_ptr 并要求它们仅在有效使用期间升级到 shared_ptr。一旦您需要删除它,只需清除shared_ptr,它会在其现役结束后自行删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多