问题标签 [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 投票
2 回答
1782 浏览

c++ - 当没有更多引用时,如何从缓存中删除(非侵入式)智能指针?

由于我的菜鸟声誉,我无法回复此Thread,特别是已接受的答案:

我从未使用过 boost::intrusive 智能指针,但如果你使用 shared_ptr 智能指针,你可以使用 weak_ptr 对象作为缓存。

当系统决定释放它们的内存时,这些weak_ptr 指针不算作引用,但只要对象尚未被删除,就可用于检索shared_ptr。

这当然是一个直观的想法,但是,C++ 标准不支持weak_ptrs 的比较,因此它不能用作关联容器的键。这可以通过为weak_ptrs实现一个比较运算符来规避:

这个解决方案的问题是

(1) 比较运算符必须为每个比较获取所有权(即从weak_ptr refs 创建shared_ptrs)

(2)当最后一个管理资源的shared_ptr被销毁时,weak_ptr并没有从缓存中擦除,而是在缓存中保留了一个过期的weak_ptr。

对于 (2),我们可以提供一个自定义析构函数 ( DeleteThread ),但是,这将需要再次从要删除的 T* 创建一个 weak_ptr,然后可以使用它从缓存中擦除 weak_ptr。

我的问题是,是否有更好的使用智能指针的缓存方法(我使用的是 VC100 编译器,没有提升),还是我根本没有得到它?

干杯,丹尼尔

0 投票
3 回答
2951 浏览

c++ - 提升 shared_from_this 和析构函数

我发现不允许在类的析构函数中调用shared_from_this:

https://svn.boost.org/trac/boost/ticket/147

此行为是设计使然。由于析构函数将销毁对象,因此为它创建 shared_ptr 是不安全的,因为一旦析构函数结束,它将变得悬空。

我理解这个论点,但是如果我需要一个“shared_from_this”指针来清理引用(而不是共享所有权)怎么办。

这是我不使用 shared_ptr 的示例:

在这里,我尝试将其转换为共享指针。但是我找不到完成析构函数的好方法:

如何实现上面示例中的析构函数?

0 投票
1 回答
482 浏览

c++ - 如何使用weak_ptr 构造一个包含对父对象的引用的对象?

假设我有一个包含子对象的 shared_ptr 的对象。

我希望子对象对父对象有一个weak_ptr,子对象的构造函数应该是什么样的,我应该如何从父对象构造一个子对象?

提前致谢

0 投票
1 回答
3331 浏览

c++ - boost::weak_ptr.lock() 因 SIGSEGV 分段错误而崩溃

(编辑)环境:

我一直在做一个服务器端项目。我使用 boost 库,例如boost::asioboost::shared_ptrboost::weak_ptr.

Boost 文档(http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/weak_ptr.htm#lock)说weak_ptr<T>.lock从不抛出:

shared_ptr lock() 常量;返回:过期()?shared_ptr():shared_ptr(*this)。

抛出:什么都没有。

但是,在我的应用程序中,它甚至崩溃了:

我检查了线路崩溃了/usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp

第 92 行是汇编代码。我真的不知道那是什么意思。

我总是检查返回的boost::weakptr<RtmpConnection>.lock()(类型boost::shared_ptr<RtmpConnection>在我使用之前是否为空。

所以我用谷歌搜索,我看到了这个http://wiki.inkscape.org/wiki/index.php/Boost_shared_pointers

出于线程安全的原因,不能取消引用弱指针。如果在检查弱指针是否过期但在使用它之前,其他线程破坏了该对象,则会发生崩溃

  1. 那么我该怎么处理它,为什么它会崩溃(似乎boost::weakptr<RtmpConnection>.lock()永远不应该崩溃)?
  2. 因为我的程序是多线程的。有可能在我得到并检查返回值之后boost::weakptr<RtmpConnection>.lock()RtmpConnection可能会被其他线程破坏,Boost库是否保证它不会被破坏,因为返回类型是boost::shared_ptr<RtmpConnection>
0 投票
1 回答
2306 浏览

c++ - 为什么 std::weak_ptr<> 不提供布尔转换?

C++11 的 std::shared_ptr<> 提供了一种布尔运算符。

operator bool() const(由于隐式转换类型的危险,这不是直接的bool。)

为什么 std::weak_ptr<> 没有类似的运算符?我发现自己不断打字

当我想打字时

为什么weak_ptr 没有bool 转换?

0 投票
3 回答
182 浏览

c++ - 如何使用智能指针做到这一点?

这是我想要实现的目标:

我想使用智能指针而不是原始指针,看看它们如何更好,但无法真正弄清楚如何实现来回切换(这是用于在游戏中轮流使用;这是一个Player *)。

我尝试用两个单独的测试替换此处的指针,std::unique_ptrstd::shared_ptr在两个单独的测试中使用reset切换,并且在第一个测试之后都给出随机数,正如预期的那样。

接下来,我尝试了std::weak_ptr它看起来像我需要的东西,尽管界面并不是那么相似。从我所看到的,使用它的唯一方法是 through lock(),所以我尝试lock().在调用之前reset附加它并将其附加到取消引用,但是崩溃了。

我如何使用std::weak_ptr而不是原始指针,或者我可以以某种方式实际使用其他指针之一?

0 投票
4 回答
1008 浏览

c++ - 在精心设计的代码中,您是否应该期望锁定 weak_ptr 总是成功?

当您希望使用弱指针进行访问时,首先建议您通过锁定获得指向对象的强指针。如果指向的对象早先被删除,锁定可能不会成功。

在我看来,除非你在打破循环以确定什么是弱指针时做错了什么,否则锁定将会成功。所以你锁定只是为了交叉检查你的设计。

这个对吗?

我看过一些关于缓存的评论,但它们似乎是对weak_ptrs的滥用。但当然,一个人的虐待是另一个人的创新。我想听听意见。

0 投票
2 回答
814 浏览

c++ - weak_ptr C++ 中的比较运算符

我仍然是新stl成员的新手。谁能指出为什么这段代码会出现分段错误?

错误在行

if(helloSet.find(StubClass(wpPtr))!=helloSet.end()) printf("YAYA");

更多研究表明,调用 StubClass 的比较器函数时存在问题。我在这里编译程序

编辑:

这解决了这个问题。我应该阅读更多内容。:(无论如何,社区中的任何人都可以解释第一个代码给出 SIGSEGV 的原因。我最终想通了,但仍然是一个很好的解释不会受到伤害。:)

0 投票
1 回答
850 浏览

c++ - 我如何获得 std::weak_ptr从这个指针?

这是示例:

怎么做?如果我需要从 派生MyClassstd::enable_shared_from_this<MyClass<T>>我如何在没有多重继承的情况下做到这一点,因为MyClass已经从另一个T祖先派生,我需要调用shared_from_this()构造函数?

在我的情况下T,可能是某个类继承自enable_shared_from_this<T>,但并非总是如此

0 投票
2 回答
18064 浏览

c++ - 为什么我不能将 nullptr 转换为 weak_ptr<>

我想做这个:

或weak_ptr参数的默认值为null,例如:

但是,我需要这样做:

这是为什么?