这是代码示例
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?
答案 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。