我有一张地图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_ptr
或shared_ptr
本身作为映射中的键。所以确实:
std::map<std::weak_ptr<void>, std::string> information_map;
能够将字符串与任何类型的弱 ptr 相关联,无论类型如何。这是因为std::less<void*>
根据标准定义了对所有可能的指针值的弱总排序。
参见
- 高级共享指针编程技术
- 如何比较指针?