5

这是代码示例

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?

4

4 回答 4

6

仔细注意正在交换的内容:

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

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

于 2012-04-06T19:33:40.973 回答
5

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

于 2012-04-06T19:32:29.823 回答
1

那为什么是0?

所以什么都有!

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

于 2012-04-06T19:33:03.223 回答
1

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

于 2012-04-06T19:33:05.837 回答