Этот оператор:
f = std::shared_ptr<foo>(new foo(std::shared_ptr<bar>(new bar())));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
создает временный shared_ptr
, который выходит за пределы области видимости в конце оператора. В этот момент shared_ptr
уходит, забирая с собой bar
(поскольку в живых не осталось копий shared_ptr
).
Но если вы измените foo
на это:
class foo
{
public:
foo(std::shared_ptr<bar> barP) { m_bar = barP; }
std::shared_ptr<bar> m_bar;
};
Тогда результат, который вы получите, вероятно, будет тем, что вы ожидали, потому что foo
поддерживает копию shared_ptr
до тех пор, пока он (foo
) не выйдет из области видимости, и эта копия сохраняет bar
живым :
before init
after init
destructor called
Живая демонстрация