问题标签 [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++ - 当没有更多引用时,如何从缓存中删除(非侵入式)智能指针?
由于我的菜鸟声誉,我无法回复此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 编译器,没有提升),还是我根本没有得到它?
干杯,丹尼尔
c++ - 提升 shared_from_this 和析构函数
我发现不允许在类的析构函数中调用shared_from_this:
https://svn.boost.org/trac/boost/ticket/147
此行为是设计使然。由于析构函数将销毁对象,因此为它创建 shared_ptr 是不安全的,因为一旦析构函数结束,它将变得悬空。
我理解这个论点,但是如果我需要一个“shared_from_this”指针来清理引用(而不是共享所有权)怎么办。
这是我不使用 shared_ptr 的示例:
在这里,我尝试将其转换为共享指针。但是我找不到完成析构函数的好方法:
如何实现上面示例中的析构函数?
c++ - 如何使用weak_ptr 构造一个包含对父对象的引用的对象?
假设我有一个包含子对象的 shared_ptr 的对象。
我希望子对象对父对象有一个weak_ptr,子对象的构造函数应该是什么样的,我应该如何从父对象构造一个子对象?
提前致谢
c++ - boost::weak_ptr.lock() 因 SIGSEGV 分段错误而崩溃
(编辑)环境:
我一直在做一个服务器端项目。我使用 boost 库,例如boost::asio
、boost::shared_ptr
和boost::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
出于线程安全的原因,不能取消引用弱指针。如果在检查弱指针是否过期但在使用它之前,其他线程破坏了该对象,则会发生崩溃
- 那么我该怎么处理它,为什么它会崩溃(似乎
boost::weakptr<RtmpConnection>.lock()
永远不应该崩溃)? - 因为我的程序是多线程的。有可能在我得到并检查返回值之后
boost::weakptr<RtmpConnection>.lock()
,RtmpConnection
可能会被其他线程破坏,Boost库是否保证它不会被破坏,因为返回类型是boost::shared_ptr<RtmpConnection>
?
c++ - 为什么 std::weak_ptr<> 不提供布尔转换?
C++11 的 std::shared_ptr<> 提供了一种布尔运算符。
operator bool() const
(由于隐式转换类型的危险,这不是直接的bool
。)
为什么 std::weak_ptr<> 没有类似的运算符?我发现自己不断打字
当我想打字时
为什么weak_ptr 没有bool 转换?
c++ - 如何使用智能指针做到这一点?
这是我想要实现的目标:
我想使用智能指针而不是原始指针,看看它们如何更好,但无法真正弄清楚如何实现来回切换(这是用于在游戏中轮流使用;这是一个Player *
)。
我尝试用两个单独的测试替换此处的指针,std::unique_ptr
并std::shared_ptr
在两个单独的测试中使用reset
切换,并且在第一个测试之后都给出随机数,正如预期的那样。
接下来,我尝试了std::weak_ptr
它看起来像我需要的东西,尽管界面并不是那么相似。从我所看到的,使用它的唯一方法是 through lock()
,所以我尝试lock().
在调用之前reset
附加它并将其附加到取消引用,但是崩溃了。
我如何使用std::weak_ptr
而不是原始指针,或者我可以以某种方式实际使用其他指针之一?
c++ - 在精心设计的代码中,您是否应该期望锁定 weak_ptr 总是成功?
当您希望使用弱指针进行访问时,首先建议您通过锁定获得指向对象的强指针。如果指向的对象早先被删除,锁定可能不会成功。
在我看来,除非你在打破循环以确定什么是弱指针时做错了什么,否则锁定将会成功。所以你锁定只是为了交叉检查你的设计。
这个对吗?
我看过一些关于缓存的评论,但它们似乎是对weak_ptrs的滥用。但当然,一个人的虐待是另一个人的创新。我想听听意见。
c++ - weak_ptr C++ 中的比较运算符
我仍然是新stl成员的新手。谁能指出为什么这段代码会出现分段错误?
错误在行
if(helloSet.find(StubClass(wpPtr))!=helloSet.end()) printf("YAYA");
更多研究表明,调用 StubClass 的比较器函数时存在问题。我在这里编译程序
编辑:
这解决了这个问题。我应该阅读更多内容。:(无论如何,社区中的任何人都可以解释第一个代码给出 SIGSEGV 的原因。我最终想通了,但仍然是一个很好的解释不会受到伤害。:)
c++ - 我如何获得 std::weak_ptr从这个指针?
这是示例:
怎么做?如果我需要从 派生MyClass
,std::enable_shared_from_this<MyClass<T>>
我如何在没有多重继承的情况下做到这一点,因为MyClass
已经从另一个T
祖先派生,我需要调用shared_from_this()
构造函数?
在我的情况下T
,可能是某个类继承自enable_shared_from_this<T>
,但并非总是如此
c++ - 为什么我不能将 nullptr 转换为 weak_ptr<>
我想做这个:
或weak_ptr参数的默认值为null,例如:
但是,我需要这样做:
这是为什么?