我有地图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;
交换它们?
提前致谢
答案 0 :(得分:2)
正如人们在评论中已经说过的那样,你不能这样做。 shared_ptr
始终拥有引用,而weak_ptr
永远不会拥有引用。标准库的API是以类型告诉您当前是否拥有引用的方式显式设计的(并且访问weak_ptr
个对象的唯一方法是lock()
它们,并检查生成的shared_ptr
是否为非null,因此您可以(确保在多线程环境中)确保您在使用对象时拥有自己的引用。
你可能做的是一直有weak_ptr
的地图,只要你想保持对象存活,就可以在其他地方存储shared_ptr
。根据设计或目的,shared_ptr
的位置甚至可能是对象的成员变量。
如果使用对映射,我不会交换()对成员,而是从一对共享和弱ptr开始引用相同的托管对象,只需重置()共享ptr,如果它决定放弃强引用,而不是触及weak_ptr。
答案 1 :(得分:0)
您始终可以使用weak_ptr
或shared_ptr
本身作为地图中的关键字。确实如此:
std::map<std::weak_ptr<void>, std::string> information_map;
无论类型如何,都可以将字符串与任何类型的弱ptr相关联。这是因为std::less<void*>
根据标准定义了对所有可能指针值的弱总排序。
另见