【问题标题】:Assigning a shared_ptr to another after calling get调用 get 后将 shared_ptr 分配给另一个
【发布时间】: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


【解决方案1】:

现在,在“shared_ptr1 = shared_ptr2”赋值之后,第一个字符串“Foo”会被垃圾回收吗?*

如果你的意思是std::make_shared&lt;std::string&gt;("Foo")分配的字符串会被销毁,那么是的。

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

【讨论】:

    【解决方案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指向不存在的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多