呼叫获取后,将共享_ptr分配给另一个

Assigning a shared_ptr to another after calling get

本文关键字:ptr 分配 另一个 共享 获取 呼叫      更新时间:2023-10-16
shared_ptr<std::string> shared_ptr1 = std::make_shared<std::string>("Foo");
shared_ptr<std::string> shared_ptr2 = std::make_shared<std::string>("Bar"); 
std::string* normal_ptr = shared_ptr1.get(); 
shared_ptr1 = shared_ptr2; 

现在,在" shared_ptr1 = shared_ptr2 "分配之后,第一个字符串" foo"是垃圾收集吗?据此," Foo"不是收集垃圾。但是我只想确保我遇到的不是不确定的行为。

谢谢!

现在,第一个字符串" foo"会在" shared_ptr1 = shared_ptr2"分配之后收集垃圾?*

如果您的意思是由std::make_shared<std::string>("Foo")分配的字符串被销毁,则是。

这意味着normal_ptr,在您执行shared_ptr1 = shared_ptr2;指向不再存在的对象之后。

我不会使用"收集垃圾"短语。在上述分配后,将简单地删除该对象,因为没有共享的_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指向不存在的对象。