c – 当shared_ptr重置为包含的同一地址时,是否可以保证weak_ptr将到期?

c – 当shared_ptr重置为包含的同一地址时,是否可以保证weak_ptr将到期?,第1张

概述当shared_ptr重置包含的同一地址时,是否可以保证weak_ptr将过期? #include <cassert>#include <memory>int main(){ int* i = new int(0); std::shared_ptr<int> si( i ); std::weak_ptr<int> wi = si; si.reset( i 当shared_ptr重置为包含的同一地址时,是否可以保证weak_ptr将过期?
#include <cassert>#include <memory>int main(){    int* i = new int(0);    std::shared_ptr<int> si( i );    std::weak_ptr<int> wi = si;    si.reset( i );    assert( wi.expired() ); // wi.expired() == true (GCC 4.7)}

或者,如果未定义wi.expired()的值,是这种情况吗?

编辑:

我现在稍微修改一下这个问题:

当shared_ptr被重置为同一个地址时,是否保证weak_ptr将到期,该地址在初始化时包含shared_ptr weak_ptr?

#include <cassert>#include <memory>int main(){    int* i = new int(0);    std::shared_ptr<int> si( i );    std::weak_ptr<int> wi = si;    si.reset();    int* j = new int(0);     // Suppose that new returns the same address that contains variable i :      assert(j == i);     si.reset( j );    assert( wi.expired() ); // wi.expired() == true (GCC 4.7)}
解决方法 一方面,它实际应该.
另一方面,将相同的指针分配给两个不同的共享指针(si-before-reset和si-after-reset)是不正确的.实际上,调用si.reset(i)它会发生:

> si的ref-count降至0
>删除i被调用
>重生的si再次指向我.

因此,重置后新分配的i将指向未分配的内存,并且wi正确到期(并且当si消失时将导致段错误,最终,再次尝试删除i).

好的做法是在将裸指针分配给shared_ptr之后永远不要引用它.

编辑后的答案:

这同样适用:指针相同的事实与shared_ptr及其内部引用计数无关.对于一个“邪恶”的例子,这可能更清楚.这是错的:

int *i = new int;  std::shared_ptr<int> si1(i);  std::shared_ptr<int> si2(i); // deleting twice i on destruction of si2 - boom!  std::weak_ptr<int> wi1 = si1;  si1.reset();  assert (wi1.expired());      // true

这与你的第一个例子类似(实际上是相同的):si1和si2是两个不同的shared_ptr(它们是si-before-reset和si-after-reset). si1和si2(错误地)指向同一个内存的事实与shared_ptr和连接的weak_ptr的生命无关.

i指针的绝对值不用于确定引用计数.对于shared_ptr和weak_ptr都是如此.所以,是的,保证!

实际上,当你需要来自其类中的对象的shared_ptr时,你需要enable_shared_from_this – 如果你使用的是shared_ptr(this)而不是shared_from_this(),你每次都会得到不同的shared_ptr – 一旦他们第一次拥有你的对象就会被破坏退出了重新计算.

总结

以上是内存溢出为你收集整理的c – 当shared_ptr重置为包含的同一地址时,是否可以保证weak_ptr将到期?全部内容,希望文章能够帮你解决c – 当shared_ptr重置为包含的同一地址时,是否可以保证weak_ptr将到期?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1256560.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存