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”字符串存储在哪里吗?我原以为它会出错,因为右值是一个临时对象。右值复制到哪里存储?
与weak_ptr
std::weak_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
cout << *test().lock() << endl;
有趣的是上面的代码出错了。有什么区别?
The above code works. Can someone please let me know where is the "sdsd" string stored. I was expecting it to error out as rvalue is a temporary object. Where is the rvalue copied to and stored in?
内存是在调用 make_shared
时分配的。
Interestingly the above code errors out. What's the difference?
不同之处在于,如果对象不存在至少一个 shared_ptr
,则对 weak_ptr
的 lock
操作可能会失败。这就是 weak_ptr
的目的——允许对象被释放并仅在它仍然存在时访问它。
在
std::shared_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
构造的 shared_ptr
被 returned 并作为一个足够长的临时变量存在,以便调用者在超出范围并释放由 [分配的 string
之前使用=14=].
“sdsd”string
由 returned shared_ptr
存储在动态存储 owned 中。
在
std::weak_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
shared_ptr
未被 return 编辑并超出范围,带走了 make_shared
分配的 string
。由于这是 shared_ptr
的唯一现有副本,因此 returned 临时 weak_ptr
变量连接到已过期的 share_ptr
。如果您测试 lock
的 return 值,您会看到它是一个 default-constructed shared_ptr
持有一个空指针。
Documentation for std::weak_ptr::lock
.
“sdsd”string
未存储在 test
return 秒后的任何位置。它在拥有它的 shared_ptr
超出范围时离开。
std::shared_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
cout << *test() << endl;
以上代码有效。有人可以让我知道“sdsd”字符串存储在哪里吗?我原以为它会出错,因为右值是一个临时对象。右值复制到哪里存储?
与weak_ptr
std::weak_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
cout << *test().lock() << endl;
有趣的是上面的代码出错了。有什么区别?
The above code works. Can someone please let me know where is the "sdsd" string stored. I was expecting it to error out as rvalue is a temporary object. Where is the rvalue copied to and stored in?
内存是在调用 make_shared
时分配的。
Interestingly the above code errors out. What's the difference?
不同之处在于,如果对象不存在至少一个 shared_ptr
,则对 weak_ptr
的 lock
操作可能会失败。这就是 weak_ptr
的目的——允许对象被释放并仅在它仍然存在时访问它。
在
std::shared_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
构造的 shared_ptr
被 returned 并作为一个足够长的临时变量存在,以便调用者在超出范围并释放由 [分配的 string
之前使用=14=].
“sdsd”string
由 returned shared_ptr
存储在动态存储 owned 中。
在
std::weak_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
shared_ptr
未被 return 编辑并超出范围,带走了 make_shared
分配的 string
。由于这是 shared_ptr
的唯一现有副本,因此 returned 临时 weak_ptr
变量连接到已过期的 share_ptr
。如果您测试 lock
的 return 值,您会看到它是一个 default-constructed shared_ptr
持有一个空指针。
Documentation for std::weak_ptr::lock
.
“sdsd”string
未存储在 test
return 秒后的任何位置。它在拥有它的 shared_ptr
超出范围时离开。