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

c++ - 什么时候应该使用weak_ptr?

我知道weak_ptr是避免循环引用的好方法。

但是,我不确定是否应该尽可能使用它来提高性能,例如仅在读取指针中的内容时。

例如,我有一个存储智能指针的向量:

我有一个功能来搜索一个项目并打印出来。

在这种情况下使用weak_ptr会更好吗?有什么我应该注意的陷阱吗?

0 投票
1 回答
11392 浏览

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 指出智能指针应该被用作简单的抽象来处理资源管理;不能在声明时在堆上创建但必须在以后创建的文件范围对象呢?

0 投票
2 回答
526 浏览

c++ - 使用 std::weak_ptr 共享资源所有权

我想知道如何(使用 C++11 并希望使用向后(boost 或 TR1)兼容的智能指针类型)实现:

一个类实例 ( ModelController) 拥有一个资源 ( InputConsumer),而另一个组件 ( InputSender,在本例中是一个单例) 可以访问它。

该模型InputSender包含一个对 的引用列表InputConsumers,其中会有很多。

ModelController可能有 none、one 或 many InputConsumers,并且可能有很多ModelControllers。InputSender不知道。

最好的方法是:一种InputSender跟踪InputConsumers分配给它的方法,它可以自己找出个人InputConsumers是否有效。

在我看来,这weak_ptr是完美的,因为它们的使用需要检查这种情况。

如果InputSender停止跟踪它的任何weak_ptrrefs,则不会发生任何不好的事情,相应InputConsumer的 s 只会经历无线电静默。

如果 aModelController被删除,或者 aModelController删除了它的一些InputConsumers,任何InputSender已经注册到它们的 s 将在下次尝试访问它们时识别它们不再存在,并且可以清理它们,而无需发送消息或做任何事。

所以问题是,这是使用shared_ptrand的合适情况weak_ptr吗?我想知道是否shared_ptr完全合适,因为InputConsumers 在概念上由它们的 s拥有ModelController,所以它们应该是成员变量。我不知道ModelController只通过shared_ptr. 我不知道是否unique_ptrweak_ptr. 我应该只管理ctor/dtorshared_ptr中的 s 吗?ModelController

可能还有一个众所周知的(对我来说不是!)设计模式,所以如果有人知道这样的事情,请告诉我。

0 投票
1 回答
590 浏览

c++ - C++11:如果使用 make_shared 构造对象,如何删除它

我错过了一些关于共享/弱指针的东西:

当 ashared_ptr使用 构造时make_shared,仅使用一次内存分配(为控制块和对象本身分配内存)。当 lastshared_ptr被销毁但还weak_ptr剩下 -s 时会发生什么?此时必须释放托管对象。但是如果分配的内存make_shared被释放,那将使弱指针无效,因为相同的释放会破坏控制块。

0 投票
2 回答
630 浏览

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!

为什么??

0 投票
5 回答
665 浏览

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拥有不同级别的所有权:

有什么想法吗?

0 投票
3 回答
4751 浏览

c++ - 如何摆脱容器中的weak_ptrs

我有一个类将weak_ptr 存储在容器中,如果weak_ptr 未过期,稍后会执行一些操作:

如果Example是一个永远存在并fill定期使用的对象,则向量会不断为元素分配内存,但它们在过期后永远不会被删除。

是否有任何自动 C++ 方法来摆脱容器中过期的weak_ptrs,或者是否有更好的方法来存储可变数量的它们?

fill我幼稚的方法是每次调用容器时都遍历容器并删除所有过期的weak_ptrs。在容器中有许多元素并且经常调用填充的情况下,Example这似乎非常低效。

0 投票
5 回答
18569 浏览

c++ - 从原始指针创建weak_ptr<>

我想将原始指针成员包装到一些智能指针,以防止在开发类中删除。指针下对象的所有者在类之外。所以,看起来boost::shared_ptrstd::auto_ptr不合适。下面是一个简化的例子:

当然,它会导致编译错误。weak_ptr从原始指针(如果存在)初始化的正确方法是什么?

0 投票
4 回答
1661 浏览

c++ - C++:用共享和弱 ptr 替换原始指针

我的程序面临设计问题。我必须管理作为根 ChainDescriptor 一部分的节点对象。

基本上它如下所示:

ChainDescriptor 类拥有所有节点并负责删除它们。但是这些类现在需要在另一个程序中使用,一个具有撤消/重做功能的 GUI,具有“所有权”的问题。在深入修改现有代码之前,我正在考虑不同的解决方案:

  • 使用shared_ptr和各自list<shared_ptr<...> >
  • 使用weak_ptr和各自list<weak_ptr<...> >

在上面的示例中,我真的不知道在哪里使用shared_ptrweak_ptr正确使用。

有什么建议吗?

0 投票
2 回答
4042 浏览

c++ - C++ weak_ptr 创建性能

我读过创建或复制 std::shared_ptr 涉及一些开销(引用计数器的原子增量等)。

但是如何从它创建一个 std::weak_ptr 呢:

我希望有更快的性能,但我知道共享指针仍然必须增加弱引用计数器。所以这仍然像将 shared_ptr 复制到另一个一样慢吗?