代码之家  ›  专栏  ›  技术社区  ›  claudius

C++ RVals SyrDypPTR和rValueValpTR

  •  0
  • claudius  · 技术社区  · 2 年前
    std::shared_ptr<std::string> test() {
      return std::make_shared<std::string>("sdsd");
    }
    
    cout << *test() << endl;
    

    以上代码有效。有人能告诉我“sdsd”字符串存储在哪里吗。我以为它会出错,因为rvalue是一个临时对象。右值复制到哪里并存储在哪里?

    具有弱ptr

    std::weak_ptr<std::string> test() {
      return std::make_shared<std::string>("sdsd");
    }
    
      cout << *test().lock() << endl;
    

    有趣的是,上面的代码出现了错误。有什么区别?

    2 回复  |  直到 2 年前
        1
  •  4
  •   user4581301    2 年前

    在里面

    std::shared_ptr<std::string> test() {
      return std::make_shared<std::string>("sdsd");
    }
    

    建造的 shared_ptr 返回并作为临时变量存在足够长的时间,以便调用者在超出范围并释放 string 分配人 make_shared .

    “sdsd” 一串 存储在动态存储中 owned 由返回的 共享ptr .

    在里面

    std::weak_ptr<std::string> test() {
      return std::make_shared<std::string>("sdsd");
    } 
    

    这个 共享ptr 没有返回,超出了范围,拿走了 一串 分配人 分享 用它。因为这是唯一现存的 共享ptr 这就留下了返回的时间 weak_ptr 变量连接到过期的 share_ptr .如果您测试 lock 你会发现这是一个默认值 共享ptr 持有空指针。

    Documentation for std::weak_ptr::lock .

    “sdsd” 一串 之后不会被存放在任何地方 test 返回。飞机起飞时它离开了 共享ptr 拥有它的人超出了范围。

        2
  •  0
  •   David Schwartz    2 年前

    以上代码有效。有人能告诉我“sdsd”字符串存储在哪里吗。我以为它会出错,因为rvalue是一个临时对象。右值复制到哪里并存储在哪里?

    内存是在对的调用中分配的 make_shared .

    有趣的是,上面的代码出现了错误。有什么区别?

    区别在于 lock 手术 weak_ptr 如果不存在至少一个,则可能会失败 shared_ptr 指向目标。这就是我们的目的 弱ptr --允许对象被释放并仅在其仍然存在时访问它。