问题标签 [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.

0 投票
1 回答
752 浏览

boost - 相同的地址,多个“shared_ptr”,enable_shared_from_this 和自定义删除器

相同地址、多个 shared_ptr 计数器相关,C++ 标准是否禁止?以及围绕多个指向同一个对象但不共享底层引用计数结构的 shared_ptr 对象的无数其他问题。

如果对象从上述问题中的“enable_shared_from_this”继承会发生什么?我的 shared_from_this() 返回什么?一个带有自定义删除器还是一个没有?

0 投票
0 回答
83 浏览

c++ - 是否有一个很好的 C++ 内存管理教程,涵盖 shared_ptr、scoped_ptr 和 weak_ptr?

可能重复:
我什么时候使用哪种指针?

我是一名前 C++ 程序员,后来转为 .NET 程序员。我对 C++ 内存管理的了解可以追溯到 2000 年代初期,而且我还没有跟上 C++11 的特性。我被要求用 C++ 做一个新项目,我希望找到一个关于使用 shared_ptr、weak_ptr 和 scoped_ptr 进行现代 C++ 内存管理的好教程。涵盖常见模式和最佳实践的东西将是理想的。你对我有什么指示吗?

0 投票
7 回答
10971 浏览

c++ - 绑定到一个weak_ptr

有没有办法将std::bind 绑定到 std::weak_ptr?我想存储一个“弱函数”回调,当被调用者被销毁时会自动“断开”。

我知道如何使用 shared_ptr 创建 std::function:

然而,返回的 std::function 让我的对象永远活着。所以我想将它绑定到一个weak_ptr

但这不编译。(std::bind 将不接受weak_ptr!)有没有办法绑定到weak_ptr?

我找到了关于这个的讨论(见下文),但似乎没有标准的实现。存储“弱功能”的最佳解决方案是什么,特别是在 Boost 不可用的情况下?


讨论/研究(所有这些都使用 Boost 并且没有标准化):

0 投票
1 回答
466 浏览

c++ - 将weak_ptr与原始指针进行比较不起作用,寻找替代方案

我有一个 SpriteManager 类,它为我加载和缓存精灵,并从缓存中删除未使用的精灵。无论如何,这就是我的想法,我有点卡住了。我有一个map<string,weak_ptr<ALLEGRO_BITMAP>>存储精灵的地方,并使用 weak_ptr 来生成shared_ptr's。现在我正在尝试使用一个删除器,它也从地图中删除位图,它看起来像这样(显然不工作):

位图是我正在谈论的地图。当然我不能比较(*it).secondand bmp,但我也不能锁定weak_ptr,因为我在删除器中。除了保留弱指针和原始指针之外,我真的别无选择吗?

0 投票
14 回答
163302 浏览

c++11 - std::weak_ptr 什么时候有用?

我开始研究 C++11 的智能指针,但我没有看到std::weak_ptr. 有人可以告诉我什么时候std::weak_ptr有用/必要吗?

0 投票
1 回答
16745 浏览

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 访问集合中的对象。

0 投票
2 回答
10342 浏览

c++ - shared_ptr 和循环引用

我正在尝试使用 的循环引用boost::shared_ptr,并设计了以下示例:

哪个输出

是不是我误解了提到的循环引用boost::shared_ptr?因为,我期望间接引用p1后评论1)2). 所以这段代码不需要boost::weak_ptr!那么weak_ptr需要 s 的循环引用是什么?

提前致谢。

0 投票
2 回答
7248 浏览

c++ - 如何使用 std::map 和 std::weak_ptr 作为键?

如何将a 用作std::weak_ptra 的键,std::map如下面的代码所示?

上面的程序没有构建并尝试编译它会给出许多错误消息,例如:

出现问题是由于以下行:

错误消息似乎与operator<. 我需要定义operator<weak_ptr?确切地说,需要定义哪些运算符才能将数据类型用作 a 的键std::map

(我应该注意我已经operator==std命名空间中定义了。另外,我打算使用weak_ptr自定义类类型而不是int.)

0 投票
4 回答
4954 浏览

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_ptrlock()在我使用它们的任何地方使用它们?

0 投票
1 回答
8867 浏览

c++ - 我是否必须使用 weak_ptr.lock() 来测试它是否指向有效对象?

必须创建一个临时的 shared_ptr 只是为了查看 weak_ptr 是否指向一个有效的对象,这似乎有点低效。我什至不想访问该对象。这是因为我有一个函数从 shared_ptr 的向量返回一个weak_ptr,如果它返回一个空的weak_ptr,那么这意味着该对象不存在该GUID。

所以我只是在测试一个对象是否存在。

有没有另一种方法来检查weak_ptr是否为空,而不创建shared_ptr?