在调用 get 后将 shared_ptr 分配给另一个
Assigning a shared_ptr to another after calling get
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;
现在,第一个字符串 "Foo" 将被垃圾收集 在 "shared_ptr1 = shared_ptr2" 作业?根据 this , "Foo" 没有被垃圾收集。但我只想确保我遇到的不是未定义的行为。
谢谢!
Now, will the first string "Foo" be garbage collected after the "shared_ptr1 = shared_ptr2" assignment?*
如果你的意思是std::make_shared<std::string>("Foo")
分配的字符串会被销毁,那么会。
这意味着 normal_ptr
,在你这样做之后 shared_ptr1 = shared_ptr2;
指向一个不再存在的对象。
我不会使用短语 "garbage collected"。在上述赋值之后,对象将被简单地删除,因为没有 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
指向non-existing对象。
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;
现在,第一个字符串 "Foo" 将被垃圾收集 在 "shared_ptr1 = shared_ptr2" 作业?根据 this , "Foo" 没有被垃圾收集。但我只想确保我遇到的不是未定义的行为。
谢谢!
Now, will the first string "Foo" be garbage collected after the "shared_ptr1 = shared_ptr2" assignment?*
如果你的意思是std::make_shared<std::string>("Foo")
分配的字符串会被销毁,那么会。
这意味着 normal_ptr
,在你这样做之后 shared_ptr1 = shared_ptr2;
指向一个不再存在的对象。
我不会使用短语 "garbage collected"。在上述赋值之后,对象将被简单地删除,因为没有 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
指向non-existing对象。