【问题标题】:boost shared_ptr operator =提升 shared_ptr 运算符 =
【发布时间】:2012-04-06 19:24:38
【问题描述】:

这里是代码示例

class A{
  int i;
public:
  A(int i) : i(i) {}
  void f() { prn(i); }
};

int main()
{
  A* pi = new A(9);
  A* pi2= new A(87);
  boost::shared_ptr<A> spi(pi);
  boost::shared_ptr<A> spi2(pi2);
  spi=spi2;
  spi->f();
  spi2->f();
  pi->f();
  pi2->f();
}

输出:

87
87
0
87

问题是为什么输出中是 0?

来自文档的注释:效果:等效于 shared_ptr(r).swap(*this)。

但是如果shared_ptr对象刚刚被交换,结果应该是9。如果第一个对象被删除,应该是Segmentation fault。

那么为什么是 0?

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    注意交换的内容:

    shared_ptr(r).swap(*this)
    // ^^^^^^^^^^
    

    这是一个由r 构造的临时 对象。临时对象立即超出范围并死亡,无论这对拥有的资源有什么影响。由于在您的代码中 spi*spi 的唯一所有者,因此该对象被删除,您随后对 pi-&gt;f() 的访问只是未定义的行为。

    【讨论】:

    • 谢谢。迄今为止最好的解释
    【解决方案2】:

    pi 已被删除。访问已删除对象的成员是未定义的行为;您可能会得到 0、其他值或分段错误。

    【讨论】:

    • 否则它可能会吃掉你的狗,让你的房子着火。代码调用 UB 所有赌注都失败了。
    【解决方案3】:

    那么为什么是 0?

    随便吧!

    spi 分配一个新值将删除它指向的前一个对象。这使得pi 成为不能再使用的悬空指针。调用pi-&gt;f() 是未定义的行为,可以产生任何结果。

    【讨论】:

      【解决方案4】:

      pi 对象在spi = spi2 之后被删除,谁知道你的运行时为释放内存做了什么。对我来说,它在 Debug 中打印 -572662307,在 Release 中打印 1315904。

      【讨论】:

        猜你喜欢
        • 2011-03-23
        • 2023-03-03
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多