问题标签 [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.
boost - 相同的地址,多个“shared_ptr”,enable_shared_from_this 和自定义删除器
与相同地址、多个 shared_ptr 计数器相关,C++ 标准是否禁止?以及围绕多个指向同一个对象但不共享底层引用计数结构的 shared_ptr 对象的无数其他问题。
如果对象从上述问题中的“enable_shared_from_this”继承会发生什么?我的 shared_from_this() 返回什么?一个带有自定义删除器还是一个没有?
c++ - 是否有一个很好的 C++ 内存管理教程,涵盖 shared_ptr、scoped_ptr 和 weak_ptr?
可能重复:
我什么时候使用哪种指针?
我是一名前 C++ 程序员,后来转为 .NET 程序员。我对 C++ 内存管理的了解可以追溯到 2000 年代初期,而且我还没有跟上 C++11 的特性。我被要求用 C++ 做一个新项目,我希望找到一个关于使用 shared_ptr、weak_ptr 和 scoped_ptr 进行现代 C++ 内存管理的好教程。涵盖常见模式和最佳实践的东西将是理想的。你对我有什么指示吗?
c++ - 绑定到一个weak_ptr
有没有办法将std::bind 绑定到 std::weak_ptr?我想存储一个“弱函数”回调,当被调用者被销毁时会自动“断开”。
我知道如何使用 shared_ptr 创建 std::function:
然而,返回的 std::function 让我的对象永远活着。所以我想将它绑定到一个weak_ptr:
但这不编译。(std::bind 将不接受weak_ptr!)有没有办法绑定到weak_ptr?
我找到了关于这个的讨论(见下文),但似乎没有标准的实现。存储“弱功能”的最佳解决方案是什么,特别是在 Boost 不可用的情况下?
讨论/研究(所有这些都使用 Boost 并且没有标准化):
c++ - 将weak_ptr与原始指针进行比较不起作用,寻找替代方案
我有一个 SpriteManager 类,它为我加载和缓存精灵,并从缓存中删除未使用的精灵。无论如何,这就是我的想法,我有点卡住了。我有一个map<string,weak_ptr<ALLEGRO_BITMAP>>
存储精灵的地方,并使用 weak_ptr 来生成shared_ptr
's。现在我正在尝试使用一个删除器,它也从地图中删除位图,它看起来像这样(显然不工作):
位图是我正在谈论的地图。当然我不能比较(*it).second
and bmp
,但我也不能锁定weak_ptr,因为我在删除器中。除了保留弱指针和原始指针之外,我真的别无选择吗?
c++11 - std::weak_ptr 什么时候有用?
我开始研究 C++11 的智能指针,但我没有看到std::weak_ptr
. 有人可以告诉我什么时候std::weak_ptr
有用/必要吗?
c++ - 等式比较 std::weak_ptr
我想比较两个 std::weak_ptr 或一个 std::weak_ptr 和一个 std::shared_ptr 是否相等。
我想知道的是每个weak_ptr/shared_ptr指向的对象是否相同。不仅如果地址不匹配,而且如果底层对象被删除然后偶然用相同的地址重建,则比较应该产生负面结果。
所以基本上,即使分配器保留相同的地址,我也希望这个断言成立:
weak_ptr 模板不提供相等运算符,据我了解,这是有充分理由的。
所以一个天真的实现看起来像这样:
如果第一个weak_ptr 在此期间过期,它产生0。如果没有,我将weak_ptr 升级为shared_ptr 并比较地址。
问题是我必须两次(一次)锁定weak_ptr!恐怕这需要太多时间。
我想出了这个:
它检查 u 的所有者块是否不在“之前”t 和 t 不在 u 之前,所以 t == u。
这是否按我的意愿工作?从不同的 shared_ptr 创建的两个weak_ptr 是否总是以这种方式比较不相等?还是我错过了什么?
编辑:为什么我首先要这样做?我想要一个带有共享指针的容器,并且我想分发对其中对象的引用。我不能使用迭代器,因为它们可能会失效。我可以分发(整数)ID,但这会导致唯一性问题,并且需要地图类型和复杂的搜索/插入/删除操作。这个想法是使用 std::set 并将指针本身(封装在包装类中)作为键,以便客户端可以使用weak_ptr 访问集合中的对象。
c++ - shared_ptr 和循环引用
我正在尝试使用 的循环引用boost::shared_ptr
,并设计了以下示例:
哪个输出
是不是我误解了提到的循环引用boost::shared_ptr
?因为,我期望间接引用p1
后评论1)
和2)
. 所以这段代码不需要boost::weak_ptr
!那么weak_ptr
需要 s 的循环引用是什么?
提前致谢。
c++ - 如何使用 std::map 和 std::weak_ptr 作为键?
如何将a 用作std::weak_ptr
a 的键,std::map
如下面的代码所示?
上面的程序没有构建并尝试编译它会给出许多错误消息,例如:
出现问题是由于以下行:
错误消息似乎与operator<
. 我需要定义operator<
吗weak_ptr
?确切地说,需要定义哪些运算符才能将数据类型用作 a 的键std::map
?
(我应该注意我已经operator==
在std
命名空间中定义了。另外,我打算使用weak_ptr
自定义类类型而不是int
.)
c++ - 有一个weak_ptr的向量,想要返回一个shared_ptr的向量
我目前正在做一个大项目,我需要使用weak_ptr
而不是shared_ptr
.
这是我的问题。
我有一个名为 House 的类,其属性为:vector<boost::shared_ptr<People>> my_people
。我想将此数据成员修改为vector<boost::weak_ptr<People>> my_people
.
我的吸气剂是
通常,只需简单的weak_ptr
我就可以返回my_people.lock();
但我有一个向量,我不知道如何做这样的事情:
换句话说,我想返回我的向量weak_ptr
但是作为向量shared_ptr
。可能吗?还是我必须返回一个向量weak_ptr
并lock()
在我使用它们的任何地方使用它们?
c++ - 我是否必须使用 weak_ptr.lock() 来测试它是否指向有效对象?
必须创建一个临时的 shared_ptr 只是为了查看 weak_ptr 是否指向一个有效的对象,这似乎有点低效。我什至不想访问该对象。这是因为我有一个函数从 shared_ptr 的向量返回一个weak_ptr,如果它返回一个空的weak_ptr,那么这意味着该对象不存在该GUID。
所以我只是在测试一个对象是否存在。
有没有另一种方法来检查weak_ptr是否为空,而不创建shared_ptr?