问题标签 [weak-ptr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将weak_pointer.lock() 增加用于创建weak_ptr 的原始shared_ptr 的引用计数
根据我的理解,如果我们使用所有 shared_ptr 对象并且如果存在循环依赖,则使用弱指针来解决循环依赖问题。弱指针用于打破循环。弱指针通过使用将创建共享指针的 lock() 来实现这一点。
但是现在假设我创建了调用 x->b->a.lock() 的锁,所以 x 的引用计数将变为 2。如果 x 离开范围,仍然会有内存泄漏对吗?因为我使用 lock() 创建了一个共享指针,并且引用计数变为 2。请让我知道我的理解是否正确。
c++11 - 在基类中使用 shared_from_this 时 C++ 抛出 bad_weak_ptr
我打算实现一个线程安全的观察者模式。但是在测试下面的代码时我得到了一个核心转储:
要运行代码,只需编译:g++ --std=c++11 code.cpp
请帮我找出其中发生的问题:
objective-c - 使用弱点有什么好处或者我们什么时候可以使用弱点?
今天我读了关于ARC的书。所以有两种类型的点,分别是强点和弱点。我已经搜索了有关他们的财产并得到了它。但我看不出或不明白为什么我们用弱点而不是强点?这是一个简单的问题。请让我轻松知道。
谢谢。
c++ - 删除原指针后访问weak_ptr
执行以下代码时出现运行时错误:
我试图找出删除原始共享指针后指针是否仍然可以访问(不应该)。
c++ - 使用空的 weak_ptr 作为参数调用 map::count 是否安全?
调用map::count
未初始化的空weak_ptr
保险箱是否安全?
我对 c++ 仍然非常缺乏经验,并且没有技能来确定这一点。
在我的应用程序中, aweak_ptr
被作为 a 中的键,map
并且必须首先通过值找到。如果找不到,weak_ptr
则return
编辑并使用未初始化的map::count
.
代码
设置
按数据查找
发现
c++ - 如何以 websocketpp::connection_hdl 为键实现 boost::unordered_map?
对于我的应用程序,将 s 的映射作为映射中的键保存更加方便和合乎逻辑websocketpp::connection_hdl
,但我发现这可能具有潜在危险,因为它们是weak_ptr
s。
但是,有人声称如果密钥过期, aboost::unordered_map
可能不会中断。weak_ptr
真的吗?如果是这样,如何构造一个以将connection_hdl
s 作为键以及插入、擦除和查找/计数?此外,能够循环通过它们需要什么,例如使用for
?
这目前超出了我的技能范围,所以我不确定我在看什么。
c++ - 如果过期的 weak_ptr 会给出未定义的行为,那么 owner_less 有什么意义?
请考虑到我的经验不足,但我不明白std::owner_less
.
我已经看到不建议使用map
with as 键,因为过期的键会破坏地图,实际上:weak_ptr
weak_ptr
如果它过期了,那么容器的顺序就会被破坏,之后尝试使用容器会给出未定义的行为。
这种行为有多不确定?我问的原因是因为文档说owner_less
:
此函数对象提供 std::weak_ptr 和 std::shared_ptr 的基于所有者(与基于值相反)的混合类型排序。顺序是这样的,两个智能指针只有在它们都是空的或者它们都管理同一个对象时才比较等价,即使 get() 获得的原始指针的值不同(例如,因为它们指向不同的子对象)同一个对象)
同样,这是我缺乏经验的说法,但听起来map
不会被过期weak_ptr
的完全破坏:
返回weak_ptr 对象是空的还是它所属的所有者组中没有更多的shared_ptr。
过期的指针在锁定时充当空的weak_ptr 对象,因此不能再用于恢复拥有的shared_ptr。
听起来它可能会变得比完全未定义更松弛。如果一个人的实现删除了过期的 weak_ptrs 并且根本没有或根本没有使用任何挥之不去的那些,那么行为何时变得未定义?
如果一个人的实现不考虑顺序,而只需要一种方便的方式将weak_ptr
s 与数据相关联,那么行为是否仍然未定义?换句话说,会不会find
开始返回错误的键?
地图
我可以在文档中找到的唯一问题是上面引用的内容,过期的 weak_ptrs 将返回等效的。
根据这些docsweak_ptr
,对于不依赖于 ordering 也不使用 expired s的实现来说,这不是问题:
联想
关联容器中的元素是通过它们的键而不是它们在容器中的绝对位置来引用的。
已订购
容器中的元素始终遵循严格的顺序。所有插入的元素都按此顺序指定一个位置。
地图
每个元素将一个键关联到一个映射值:键用于标识其主要内容是映射值的元素。
听起来如果一个实现不关心 order 也不使用 expired weak_ptr
s 那么就没有问题,因为值是通过 key 而不是 order 引用的,因此find
expiredweak_ptr
可能会返回另一个weak_ptr
s 值,但因为它没有用在这个特定的实现中,除了是erase
d 之外,没有问题。
我可以看到需要使用weak_ptr
ordering 或 expired weak_ptr
s 可能是一个问题,无论可能是什么应用程序,但所有行为似乎都远未定义,因此 a map
orset
似乎并没有被 expired 完全破坏weak_ptr
。
是否有更多的技术解释map
,weak_ptr
和owner_less
反驳这些文档和我的解释?
c++ - 在 std::set 或 std::map 的键中使用 weak_ptr 是否安全
今天有许多关于关联容器std::weak_ptr
和. 有许多帖子指出在 a 中使用a是不正确的,因为如果弱指针过期,它将是未定义的行为。这个对吗?std::owner_less
std::set
std::map
weak_ptr
std::set
c++ - 如何保持 const 正确性和 RAII?
我的情况类似于包括:
我不能shared_ptr
在B
构造之前,所以之前a
被初始化。所以,我需要在构造后初始化我的常量字段(我认为它拒绝 RAII),或者只是稍后再构造它(所以它不能是 const,所以它否认 const 正确性,并且看起来也不太一致RAII)。
这看起来很常见。有没有最干净的方法来处理这个?你会怎么做?
c++ - 智能指针+循环+“->”
有时我真的很确定我想要指针的循环依赖,并且循环上的每个对象都应该能够使用他的指针(所以它不能是weak_ptr)。
我的问题是:这是否意味着我的设计不好?
如果我想实现图形怎么办?我可以使用智能指针吗?在图中有循环,但是对于weak_ptr,我不能使用“->”。我能做些什么?
我在 StackOverflow 上阅读了一些文章、参考资料和主题,但看起来我仍然没有得到智能指针。真的,为什么不存在一些带有“->”的weak_ptr变体?