C++ 右值shared_ptr 和右值weak_ptr

cla*_*ius 5 c++ weak-references shared-ptr

std::shared_ptr<std::string> test() {
  return std::make_shared<std::string>("sdsd");
}
Run Code Online (Sandbox Code Playgroud)
cout << *test() << endl;
Run Code Online (Sandbox Code Playgroud)

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

使用weak_ptr

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

有趣的是上面的代码出错了。有什么不同?

use*_*301 6

std::shared_ptr<std::string> test() {
  return std::make_shared<std::string>("sdsd");
}
Run Code Online (Sandbox Code Playgroud)

构造的对象shared_ptr被返回,并作为临时变量存在足够长的时间,以便在超出范围并释放由string分配的对象之前供调用者使用make_shared

“sdsd”string存储在返回shared_ptr.

std::weak_ptr<std::string> test() {
  return std::make_shared<std::string>("sdsd");
} 
Run Code Online (Sandbox Code Playgroud)

没有shared_ptr返回并且超出了范围,并带走了string分配的值make_shared。由于这是唯一现有的副本,shared_ptr因此返回的临时weak_ptr变量连接到过期的share_ptr. 如果您测试返回值,lock您将看到它是一个默认构造的shared_ptr持有空指针的值。

的文档std::weak_ptr::lock

返回后, “sdsd”string不会存储在任何地方testshared_ptr当拥有它的人超出范围时,它就离开了。