问题标签 [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_ptr 上调用reset 吗?
我有一组Creature
对象,这些对象是在我的应用程序的一个部分中使用std::make_shared
和创建和拥有的std::shared_ptr
。
我还Creature
使用.World
std::weak_ptr<Creature>
的调用者GetSelection
负责检查指针是否为空。如果是,则表示当前没有选择。
This all works perfectly to my liking: when the selected Creature
dies of natural causes (elsewhere in the application), GetSelection
starts returning a nullptr
again as if nothing was ever selected.
但是在这种情况下,World::selection
成员仍然指向std::shared_ptr
的控制块。这可能很大,因为我std::make_shared
用来创建我的Creature
对象(我意识到该Creature
对象在正确的时间被正确地销毁,但它的内存仍然被分配)。我正在考虑改成GetSelection
这样:
一旦我注意到不再需要它,这就会释放内存。烦人的是,这个版本的GetSelection
cannot be const
。
我的问题:
在这种情况下,哪个版本
GetSelection
被认为是最佳实践?如果在模板代码中发生类似的事情,答案是否会改变,哪里
sizeof(T)
未知并且可能很大?或者在 C++14 中std::make_shared<T[]>
可能涉及到什么?如果第二个版本总是最好的,那么自己不做的理由是
std::weak_ptr<T>::expired
什么lock
?
c++ - 为什么我在锁定weak_ptr 时会出现访问冲突?
我有一个 std::weak_ptr。在尝试使用底层对象之前,我将其锁定以获取 shared_ptr:
通常这工作正常。但是,有时我在调用锁定期间遇到访问冲突:
我的猜测是底层指针已经被删除了,但是我对weak_ptr的理解是,在这种情况下,lock应该返回一个nullptr。我在滥用类型吗?如果没有,我应该如何进行调试?
c++ - C ++绑定到weak_ptr不起作用
我有一个简单的测试,我试图将一个weak_ptr参数绑定到一个采用weak_ptr的全局函数,如果支持指针仍然有效,则调用一个方法。
当我使用弱指针创建 lambda 时,这似乎有效。如果我使用weak_ptr 直接调用全局方法,它也可以工作。但是,如果我提前将全局函数绑定到weak_ptr,它似乎不起作用。以下淡化代码说明了这个问题。
我一定错过了一些简单的东西。有什么线索吗?
结果输出:
期望第一个 weakPrintValue 打印值 (7)
c++ - 以weak_ptr为参数的函数重载决议
我有:
然后在 B 函数中:
所以问题是:
- 编译器错误:
error C2440: 'static_cast' : cannot convert from 'B *const ' to 'A *'
- 编译器错误:
error C2668: ambiguous call to overloaded function
我不明白如何解决它们,因为:
- 我认为它与 shared_from_this 有某种联系,因为这是const 指针。但是如果没有 const_cast,我不知道如何处理这种情况。
- 我不知道函数是否可以被不同类型的弱指针重载。
搭建环境:MSVS 2013 express
请帮忙。谢谢
c++ - 便携式黑客从weak_ptr泄漏原始指针
我有由shared_ptr
s 组成的对象结构,加上weak_ptr
s 以避免循环。原始指针是不行的,因为boost::serialization
在通过对象跟踪作为序列化时间进行反序列化时,需要恢复共享指针和弱指针。对象生命周期模式很复杂(粒子模拟),但完全可以预测。每当我使用weak_ptr::lock()
时,我确信指针仍然有效。通常,lock().get()
我只在很短的时间内需要该对象。
现在,lock().get()
具有性能影响,因为它会增加共享计数(in lock()
),然后很快就会减少它(临时shared_ptr
被破坏)。
这个2002 年的 boost.devel 帖子说,在weak_ptr
开发过程中,直接访问原始指针的功能被考虑(命名为unsafe_get
or leak
),但从未进入实际实现。它的缺失迫使程序员在给定条件下使用次优接口。
现在,问题是如何模拟unsafe_get
/ leak
,换句话说,从 获取原始指针weak_ptr
,程序员的风险无效,只读取(不写入)数据。我可以想象一些技巧,比如找出内部原始指针的偏移量shared_ptr
或类似的东西可以完成这项工作。
我正在使用boost::shared_ptr
,但该解决方案也适用于 c++11 std::shared_ptr
。
c++ - 可以将过期的weak_ptr 与未初始化的weak_ptr 区分开来吗?
例如:
这样的功能可能吗?
用例:类的构造函数std::weak_ptr<Foo>
作为依赖项。传递过期对象是可以的(可能在某些工作流中发生),但传递 null 意味着程序员忘记了一些东西。作为构造函数参数验证的一部分,我想对此进行测试。
c++ - 我应该如何设计一个健壮的监听器对象?
假设您必须拥有对象具有不相关生命周期的 A 和 B 类:
有一次,我在 B 的对象上注册了一个从 A 对象获得的 StateChanger。现在 A 死了,销毁了它自己的 StateChanger。但是 B 在 StateChanger 上活着并调用了一个方法,因为它认为它还活着。我的目标是使 Notify() 方法尽可能健壮。
当然,我们可以编写一些自动注册/注销观察者。这对我来说似乎有很多开销。
或者传递一个weak_ptr,这意味着在IA 对象上创建StateChanger 作为shared_ptr。而且,我需要有一个额外的方法来返回 IA 的 weak_ptr 而不是引用,当有人直接使用 A 时,这很难看。
或者,我可以写一个关于如何正确使用 API 的评论,并且在 B 处取消注册 StateChanger 的情况下杀死 IA 是邪恶的。这肯定会导致崩溃。
根据我的阅读,observer_ptr 可能是一种选择——但它还没有标准化。
所以这是我的问题:我的想法是否错误?有没有更简单的设计?
c++ - 查找引用 shared_ptr 的 weak_ptrs
有没有办法找出一个 shared_ptr 被引用的 weak_ptr 的数量?
unique()/use_count() 可用于查找 shared_ptrs,但是否有类似的构造用于查找引用的 weak_ptrs。
仅当没有 weak_ptr 引用它时,我才想释放 shared_ptr 持有的资源。所以将来某个时候如果我尝试从这个weak_ptr创建一个shared_ptr,我不应该得到一个nullptr。
目前在 C++11 中这可能吗?
caching - 获取指向资源的weak_ptr对象的数量
我正在尝试创建一个自定义兑现机制,在其中将 a 返回weak_ptr
到创建的缓存。在内部,我持有一个shared_ptr
来控制对象的生命周期。
当最大缓存预设被消耗完时,disposer会寻找那些长时间没有被访问的缓存对象,并将其清理干净。
不幸的是,这可能并不理想。如果可以检查通过 可以访问多少缓存对象weak_ptr
,那么这可以作为决定是否清理的标准。
事实证明,没有办法检查有多少人weak_ptr(s)
可以处理该资源。
但是当我查看shared_ptr
文档和实现说明时
=>weak_ptrs
引用托管对象的数量
是实施的一部分。为什么这不通过 API 公开?
c++ - 如何在 C++11 lambda 中跟踪对象生命周期?
有时,我们对捕获对象状态的 lambda 的生命周期一无所知(例如,从对象返回它,将其注册为无法取消订阅的回调等)。如何确保 lambda 在调用时不会访问已销毁的对象?
该程序打印“错误”而不是“确定”(http://ideone.com/Srp7RC)只是巧合(似乎它只是为第二个Foo
对象重用了相同的内存)。无论如何,这是一个错误的程序。当我们执行时,第一个Foo
对象已经死了f
。