C++ 调用get后将共享\u ptr分配给另一个

C++ 调用get后将共享\u ptr分配给另一个,c++,pointers,move,shared-ptr,move-semantics,C++,Pointers,Move,Shared Ptr,Move Semantics,现在,在shared_ptr1=shared_ptr2分配之后,第一个字符串Foo会被垃圾收集吗?根据我们的说法,Foo不是垃圾收集的。但我只是想确保我遇到的不是一种未定义的行为 谢谢大家! 现在,在shared_ptr1=shared_ptr2分配之后,第一个字符串Foo会被垃圾收集吗* 如果您的意思是std::make_sharedFoo分配的字符串将被销毁,那么是的 这意味着,在执行shared_ptr1=shared_ptr2之后,正常的_ptr;指向不再存在的对象。我不会使用垃圾收集这

现在,在shared_ptr1=shared_ptr2分配之后,第一个字符串Foo会被垃圾收集吗?根据我们的说法,Foo不是垃圾收集的。但我只是想确保我遇到的不是一种未定义的行为

谢谢大家!

现在,在shared_ptr1=shared_ptr2分配之后,第一个字符串Foo会被垃圾收集吗*

如果您的意思是std::make_sharedFoo分配的字符串将被销毁,那么是的


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

我不会使用垃圾收集这个短语。在上述赋值之后,该对象将被简单地删除,因为没有共享的ptr指向它。您可以使用以下代码对其进行测试:

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; 

这意味着在分配之后,普通的ptr指向不存在的对象。

我们并不确切知道您遇到了什么。但我怀疑这与分配shared_ptr1=shared_ptr2之后指针normal_ptr变得无效有关?@molbdnilo std::shared_ptr可以看作是C++支持引用计数的方式。引用计数是一种有效的垃圾收集形式。公平地说,我相信std::shared_ptr是一种垃圾收集形式的观点。您正在删除内存中阅读。如果您使用valgrind运行代码,您将看到错误;它有未定义的行为。@FrançoisAndrieux 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