C++ 右值 shared_ptr 和右值 weak_ptr

C++ rvalue shared_ptr and rvalue weak_ptr

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

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

与weak_ptr

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

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

The above code works. Can someone please let me know where is the "sdsd" string stored. I was expecting it to error out as rvalue is a temporary object. Where is the rvalue copied to and stored in?

内存是在调用 make_shared 时分配的。

Interestingly the above code errors out. What's the difference?

不同之处在于,如果对象不存在至少一个 shared_ptr,则对 weak_ptrlock 操作可能会失败。这就是 weak_ptr 的目的——允许对象被释放并仅在它仍然存在时访问它。

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

构造的 shared_ptr 被 returned 并作为一个足够长的临时变量存在,以便调用者在超出范围并释放由 [分配的 string 之前使用=14=].

“sdsd”string 由 returned shared_ptr 存储在动态存储 owned 中。

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

shared_ptr 未被 return 编辑并超出范围,带走了 make_shared 分配的 string。由于这是 shared_ptr 的唯一现有副本,因此 returned 临时 weak_ptr 变量连接到已过期的 share_ptr。如果您测试 lock 的 return 值,您会看到它是一个 default-constructed shared_ptr 持有一个空指针。

Documentation for std::weak_ptr::lock.

“sdsd”string 未存储在 test return 秒后的任何位置。它在拥有它的 shared_ptr 超出范围时离开。