问题标签 [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?
我知道weak_ptr是避免循环引用的好方法。
但是,我不确定是否应该尽可能使用它来提高性能,例如仅在读取指针中的内容时。
例如,我有一个存储智能指针的向量:
我有一个功能来搜索一个项目并打印出来。
在这种情况下使用weak_ptr会更好吗?有什么我应该注意的陷阱吗?
c++ - std::unique_ptr vs std::shared_ptr vs std::weak_ptr vs std::auto_ptr vs 原始指针
与使用原始指针的类似(但不限于)一些高级技术相比,每个智能指针的等效用途是什么?
我的理解很少,但据我所知:
- 原始指针:只有在你真的、真的、真的、真的知道你在做什么并且小心地隐藏在界面后面的用法时才使用。
- std::auto_ptr:已过时永不使用。
- std::unique_ptr:在赋值时转移所有权的单例指针。
- std::shared_ptr:引用计数指针,在分配时不转移所有权,但增加其引用计数。当所有引用离开范围或显式地调用
std::shared_ptr::reset
底层时deallocator
。 - std::weak_ptr:
std::shared_ptr
不增加引用计数并且在其父std::shared_ptr
不再存在时失效的子类型。可能返回和无效引用。使用前请务必检查。
原始指针等效示例
引用计数,缓存实现: std::map<std::string, std::pair<long, BITMAP*> > _cache;
所有权转让的单身人士:
聚合容器,无所有权:空间分区图和树,迭代容器等。
复合容器,所有权:大型对象。
- 编辑 -
在我工作的过程中,我遇到了一个有趣的案例,DeadMG 指出智能指针应该被用作简单的抽象来处理资源管理;不能在声明时在堆上创建但必须在以后创建的文件范围对象呢?
c++ - 使用 std::weak_ptr 共享资源所有权
我想知道如何(使用 C++11 并希望使用向后(boost 或 TR1)兼容的智能指针类型)实现:
一个类实例 ( ModelController
) 拥有一个资源 ( InputConsumer
),而另一个组件 ( InputSender
,在本例中是一个单例) 可以访问它。
该模型InputSender
包含一个对 的引用列表InputConsumers
,其中会有很多。
ModelController
可能有 none、one 或 many InputConsumers
,并且可能有很多ModelController
s。InputSender
不知道。
最好的方法是:一种InputSender
跟踪InputConsumers
分配给它的方法,它可以自己找出个人InputConsumers
是否有效。
在我看来,这weak_ptr
是完美的,因为它们的使用需要检查这种情况。
如果InputSender
停止跟踪它的任何weak_ptr
refs,则不会发生任何不好的事情,相应InputConsumer
的 s 只会经历无线电静默。
如果 aModelController
被删除,或者 aModelController
删除了它的一些InputConsumer
s,任何InputSender
已经注册到它们的 s 将在下次尝试访问它们时识别它们不再存在,并且可以清理它们,而无需发送消息或做任何事。
所以问题是,这是使用shared_ptr
and的合适情况weak_ptr
吗?我想知道是否shared_ptr
完全合适,因为InputConsumer
s 在概念上由它们的 s拥有ModelController
,所以它们应该是成员变量。我不知道ModelController
只通过shared_ptr
. 我不知道是否unique_ptr
与weak_ptr
. 我应该只管理ctor/dtorshared_ptr
中的 s 吗?ModelController
可能还有一个众所周知的(对我来说不是!)设计模式,所以如果有人知道这样的事情,请告诉我。
c++ - C++11:如果使用 make_shared 构造对象,如何删除它
我错过了一些关于共享/弱指针的东西:
当 ashared_ptr
使用 构造时make_shared
,仅使用一次内存分配(为控制块和对象本身分配内存)。当 lastshared_ptr
被销毁但还weak_ptr
剩下 -s 时会发生什么?此时必须释放托管对象。但是如果分配的内存make_shared
被释放,那将使弱指针无效,因为相同的释放会破坏控制块。
c++ - weak-ptr 变为 null,每周使应用程序崩溃 1 次
RFNReader_NFCP.exe.4448.dmp 中 0x764F135D (kernel32.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0x00000001。
调试窗口中
变量item的值:
item shared_ptr {m_interface="10.243.112.12" m_port="8889" m_clientSockets={ size=0 } ...} [3 strong refs, 2 weak refs] [default] std:: tr1::shared_ptr
但在 item->Update()
中: item(this)变为 null!
为什么??
c++ - 存储非拥有引用的对象,在销毁引用之前必须通知该引用
我有一个遵循这种模式的课程:
这些Foo
对象都归 a 拥有Bar
:
当然,这是一个简单的例子来理解这个想法。我保证没有 s 的循环Foo
,并且链接Foo
的 s 都属于 的同一个实例Bar
。到目前为止,一切都很好。要以 C++11 的方式做事,我会使用vector< unique_ptr<Foo> > foos_;
in ,并作为构造函数的潜在参数Bar
传递。foos_[i].get()
Foo
有这样的交易:
这是一个GUI应用程序,用户可以交互地随意删除一些Foo
。预期的行为是如果foo1
被删除,并且foo2
相对于foo1
,则foo2
现在变为“绝对”:
我知道可以使用原始指针,通过使用带有反向指针的 DAG 结构来做到这一点,因此Foo
知道谁“依赖于他们”,并可以在删除之前通知他们(此处和此处详述的可能解决方案)。
我的问题是:你会以同样的方式处理它吗?有没有办法使用标准 C++11 智能指针来避免显式反向指针,然后避免显式调用areRelativeToMe_[i]->convertToAbsolute();
的析构函数Foo
?我在想weak_ptr
,本着以下精神:
但问题是convertToAbsolute()
需要亲属Foo
仍然存在。所以我需要一个非拥有的智能指针,它可以告诉“这个引用在逻辑上已过期”,但实际上延长了被引用对象的生命周期,直到不需要它为止。
它可以被看作是weak_ptr
延长生命周期,直到它不与任何其他人共享weak_ptr
:
或者像shared_ptr
拥有不同级别的所有权:
有什么想法吗?
c++ - 如何摆脱容器中的weak_ptrs
我有一个类将weak_ptr 存储在容器中,如果weak_ptr 未过期,稍后会执行一些操作:
如果Example
是一个永远存在并fill
定期使用的对象,则向量会不断为元素分配内存,但它们在过期后永远不会被删除。
是否有任何自动 C++ 方法来摆脱容器中过期的weak_ptrs,或者是否有更好的方法来存储可变数量的它们?
fill
我幼稚的方法是每次调用容器时都遍历容器并删除所有过期的weak_ptrs。在容器中有许多元素并且经常调用填充的情况下,Example
这似乎非常低效。
c++ - 从原始指针创建weak_ptr<>
我想将原始指针成员包装到一些智能指针,以防止在开发类中删除。指针下对象的所有者在类之外。所以,看起来boost::shared_ptr
和std::auto_ptr
不合适。下面是一个简化的例子:
当然,它会导致编译错误。weak_ptr
从原始指针(如果存在)初始化的正确方法是什么?
c++ - C++:用共享和弱 ptr 替换原始指针
我的程序面临设计问题。我必须管理作为根 ChainDescriptor 一部分的节点对象。
基本上它如下所示:
ChainDescriptor 类拥有所有节点并负责删除它们。但是这些类现在需要在另一个程序中使用,一个具有撤消/重做功能的 GUI,具有“所有权”的问题。在深入修改现有代码之前,我正在考虑不同的解决方案:
- 使用
shared_ptr
和各自list<shared_ptr<...> >
- 使用
weak_ptr
和各自list<weak_ptr<...> >
在上面的示例中,我真的不知道在哪里使用shared_ptr
和weak_ptr
正确使用。
有什么建议吗?
c++ - C++ weak_ptr 创建性能
我读过创建或复制 std::shared_ptr 涉及一些开销(引用计数器的原子增量等)。
但是如何从它创建一个 std::weak_ptr 呢:
我希望有更快的性能,但我知道共享指针仍然必须增加弱引用计数器。所以这仍然像将 shared_ptr 复制到另一个一样慢吗?