Я бы не использовал фразу "сбор мусора".После упомянутого присваивания объект будет просто удален, потому что на него не указывает ни один shared_ptr.Вы можете проверить его с помощью следующего кода:
struct S{
std::string s;
S(std::string s){
this->s = s;
}
~S(){
std::cout << "~S() with string " << s << std::endl;
}
};
int main()
{
std::shared_ptr<S> shared_ptr1 = std::make_shared<S>("Foo");
std::shared_ptr<S> shared_ptr2 = std::make_shared<S>("Bar");
S* normal_ptr = shared_ptr1.get();
std::cout << "after get()" << std::endl;
shared_ptr1 = shared_ptr2;
std::cout << "end of main" << std::endl;
}
, который дает
after get()
~S() with string Foo
end of main
~S() with string Bar
, что означает, что после присвоения normal_ptr
указывает на несуществующий объект.