在调用get

时间:2019-05-21 17:16:36

标签: c++ pointers move shared-ptr move-semantics

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” ?根据{{​​3}}的说法,“ Foo”不是垃圾收集。但我只想确保我遇到的不是未定义的行为。

谢谢!

2 个答案:

答案 0 :(得分:4)

  

现在,在分配“ shared_ptr1 = shared_ptr2”之后,是否将第一个字符串“ Foo”作为垃圾回收?*

如果您的意思是将销毁std::make_shared<std::string>("Foo")分配的字符串,那么可以。

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

答案 1 :(得分:2)

我不会使用“收集的垃圾”一词。在完成上述分配后,将删除该对象,因为没有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指向不存在的对象。