[英]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.