使shared_ptr变弱

时间:2014-11-19 22:58:37

标签: c++11 memory-management smart-pointers

我有地图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;

交换它们?

提前致谢

2 个答案:

答案 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_ptrshared_ptr本身作为地图中的关键字。确实如此:

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

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

另见