我有一张 map 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
是否为非空,这样您就可以(即使在多线程环境中)确保您自己拥有一个引用在处理对象时。
您可以做的就是始终拥有一个 weak_ptr
映射,并在其他地方存储一个 shared_ptr
只要您想让对象保持事件状态。根据设计或目的,shared_ptr
的位置甚至可能是对象的成员变量。
如果您使用成对的映射,我不会 swap() 对成员,而是从一对引用同一托管对象的共享和弱 ptr 开始,并且只需重置()共享 ptr(如果它)决定放弃强引用,此时不触及weak_ptr。
关于c++11 - 使shared_ptr变弱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27028644/