使shared_ptr变得虚弱



我有一张地图shared_ptrs

std::unordered_map<uint64_t, std::shared_ptr<Target>> map;

有没有办法让他们在某个时候weak_ptrs或者我必须做类似的东西

std::unordered_map<uint64_t, 
    std::pair<std::shared_ptr<Target>, 
    std::weak_ptr<Target>>> map;

并交换它们?

提前致谢

正如人们在评论中已经说过的那样,你不能这样做。shared_ptr总是拥有引用,而weak_ptr永远不会拥有。标准库的 API 是显式设计的,类型会告诉您当前是否拥有引用(并且访问weak_ptr对象的点lock()它们,并检查生成的shared_ptr是否为非 null,因此您可以(即使在多线程环境中)确保, 您在使用该对象时拥有自己的引用。

你可以做的是一直有一个weak_ptr的地图,并在其他地方存储一个shared_ptr,只要你想保持对象活着。根据设计或用途,shared_ptr的位置甚至可能是对象的成员变量。

如果您使用对映射,我不会交换()对成员,而是从一对引用同一托管对象的共享和弱ptr开始,如果决定删除强引用,则只需重置()共享ptr,此时不触及weak_ptr。

您始终可以使用weak_ptrshared_ptr本身作为映射中的键。所以确实:

std::map<std::weak_ptr<void>, std::string> information_map;

能够将字符串与任何类型的弱 ptr 相关联,无论类型如何。这是因为std::less<void*>根据标准定义了对所有可能的指针值的弱总排序。

参见

  • 高级共享指针编程技术
  • 如何比较指针?

相关内容

  • 没有找到相关文章

最新更新