Here is code example
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();
}
output:
87
87
0
87
The question is why is 0 in the output?
Note from documentation: Effects: Equivalent to shared_ptr(r).swap(*this).
But if shared_ptr objects just swapped, the result should be 9. And if the first object is deleted, there should be Segmentation fault.
So why 0?
Pay careful attention to what is being swapped:
That’s a temporary object constructed from
r. The temporary goes out of scope immediately and dies, with whichever effects this has on the owned resource. Since in your codespiwas the only owner of*spi, the object is deleted, and your subsequent access ofpi->f()is simply undefined behaviour.