这里是代码示例
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?
最佳答案
请注意正在交换的内容:
shared_ptr(r).swap(*this)
// ^^^^^^^^^^
这是一个从 r
构造的临时对象。临时对象立即超出范围并消亡,无论这对拥有的资源有何影响。由于在您的代码中 spi
是 *spi
的唯一所有者,因此该对象被删除,您随后对 pi->f()
的访问只是未定义的行为。
关于c++ - boost shared_ptr 运算符 =,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10048256/