【发布时间】:2019-05-21 17:16:36
【问题描述】:
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”会被垃圾回收吗?根据this ,“Foo”不是垃圾收集。但我只想确保我遇到的不是未定义的行为。
谢谢!
【问题讨论】:
-
我们并不确切知道您遇到的什么。但我怀疑它与指针
normal_ptr在分配shared_ptr1 = shared_ptr2后变得无效有关? -
@molbdnilo
std::shared_ptr可以看作是 C++ 支持引用计数的方式。引用计数是垃圾收集的一种有效形式。我相信std::shared_ptr是一种公平的垃圾收集形式的观点。 -
您正在阅读已删除的内存。如果你用 valgrind 运行你的代码,你会看到错误。
-
你不能从你链接的代码中推断出任何东西;它有未定义的行为。
-
@FrançoisAndrieux
shared_ptr是一个共享对象,它的生命周期与其寿命最长的所有者一样长。引用计数是(相当明显的)支持共享所有权的实现机制,而不是相反。
标签: c++ pointers move shared-ptr move-semantics