[英]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 指针。
test
返回后,“sdsd” string
不会存储在任何地方。 当拥有它的shared_ptr
超出 scope 时,它就离开了。
上面的代码有效。 有人可以让我知道“sdsd”字符串存储在哪里吗? 我原以为它会出错,因为右值是一个临时值 object。右值复制到并存储在何处?
memory 是在调用make_shared
时分配的。
有趣的是,上面的代码出错了。 有什么不同?
不同之处在于,如果不存在至少一个指向 object 的shared_ptr
,则对weak_ptr
的lock
操作可能会失败。这就是weak_ptr
的目的——允许释放 object 并仅在它仍然存在时访问它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.