boost shared_ptr operator =

时间:2012-04-06 19:24:38

标签: c++ boost shared-ptr

这是代码示例

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.如果第一个对象被删除,则应该存在分段错误。

那么为什么0?

4 个答案:

答案 0 :(得分:6)

要特别注意所交换的内容:

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

这是一个由r构造的临时对象。临时超出范围并立即死亡,这对已拥有的资源产生了影响。由于您的代码spi*spi的唯一所有者,因此该对象将被删除,您对pi->f()的后续访问只是未定义的行为。

答案 1 :(得分:5)

pi已被删除。访问已删除对象的成员是未定义的行为;你可以得到0,其他一些值或分段错误。

答案 2 :(得分:1)

  

那么为什么0?

所以什么!

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

答案 3 :(得分:1)

pi之后删除

spi = spi2对象,并且知道运行时为释放的内存做了什么。对我来说,它在Debug中打印-572662307,在Release中打印1315904。