cla*_*ius 5 c++ weak-references shared-ptr
std::shared_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
Run Code Online (Sandbox Code Playgroud)
cout << *test() << endl;
Run Code Online (Sandbox Code Playgroud)
上面的代码有效。有人可以告诉我“sdsd”字符串存储在哪里吗?我原以为它会出错,因为右值是一个临时对象。右值复制并存储在哪里?
使用weak_ptr
std::weak_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
Run Code Online (Sandbox Code Playgroud)
cout << *test().lock() << endl;
Run Code Online (Sandbox Code Playgroud)
有趣的是上面的代码出错了。有什么不同?
在
std::shared_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
Run Code Online (Sandbox Code Playgroud)
构造的对象shared_ptr被返回,并作为临时变量存在足够长的时间,以便在超出范围并释放由string分配的对象之前供调用者使用make_shared。
“sdsd”string存储在返回的shared_ptr.
在
std::weak_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
Run Code Online (Sandbox Code Playgroud)
没有shared_ptr返回并且超出了范围,并带走了string分配的值make_shared。由于这是唯一现有的副本,shared_ptr因此返回的临时weak_ptr变量连接到过期的share_ptr. 如果您测试返回值,lock您将看到它是一个默认构造的shared_ptr持有空指针的值。
返回后, “sdsd”string不会存储在任何地方test。shared_ptr当拥有它的人超出范围时,它就离开了。
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |