繁体   English   中英

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”字符串存储在哪里吗? 我原以为它会出错,因为右值是一个临时值 object。右值复制到并存储在何处?

使用 weak_ptr

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

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

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

构造的shared_ptr被返回并作为一个临时变量存在足够长的时间以供调用者在退出 scope 并释放由make_shared分配的string之前使用。

“sdsd” string存储在返回的shared_ptr 拥有的动态存储中。

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

shared_ptr没有返回并从 scope 中取出,带走了make_shared分配的string 由于这是shared_ptr的唯一现有副本,因此返回的临时weak_ptr变量连接到过期的share_ptr 如果您测试lock的返回值,您会看到它是一个默认构造的shared_ptr ,其中包含一个 null 指针。

std::weak_ptr::lock的文档

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

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

memory 是在调用make_shared时分配的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM