c++11 - 使shared_ptr变弱

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

我有一张 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/

相关文章:

java - VisualVM 堆大小不遵循已用大小

c++ - 共享指针存储在存储在共享指针中的另一个对象内的智能指针 vector 中(Shareption)

c++ - C++11中auto是如何实现的

c++ - 因shared_ptr而崩溃

c++ - 在 linux 下的 GCC 中使用 std::thread 的正确链接选项是什么?

c++ - 智能指针包装 CoTaskMemAlloc 和 CoTaskMemFree

c++ - std::vector of vectors 释放其 shared_ptr 内容(堆栈实体对象的使用不正确?)

c++ - duration_cast 怎么轮

iphone - 仅在慢速连接时清除IdleCellConnections

c++ - 删除动态数组?