簡體   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