[英]Does referencing a shared pointer in a lambda preserve object lifetime?
基本上是標題中的問題。 考慮我必須使用一些異步 API,在 lambda 中對本地范圍共享 ptr 的引用是否會保留它的生命周期? 這是一種安全的做法嗎?
class A
{
public:
static void foo();
}
A::foo()
{
std::shared_ptr<MyType> MyTypePtr = std::make_shared<MyType>();
MyTypePtr->asyncAPI([&MyTypePtr]() // this would return as soon as called
{
// doStuffWith MyTypePtr...
});
}
此 lambda通過引用捕獲shared_ptr
。 這就是捕獲列表中“ &
”的含義。 它只捕獲對shared_ptr
的引用。 當函數返回時, shared_ptr
被銷毀,讓 lambda 持有一個包含對已銷毀對象的引用的包。 對該對象的任何進一步使用都會導致未定義的行為。
lambda 捕獲永遠不會保留任何東西的生命周期。 它要么按值捕獲,有效地復制捕獲的對象(原始對象的生命周期不受任何影響),要么按引用捕獲。
請不要這樣做!
如果我理解正確,lambda 將在另一個線程上執行。 即使不是這種情況,該建議仍然有效。
如果你不能承諾shared_ptr
的生命周期,則通過值傳遞它,對象的生命周期將被延長。
MyTypePtr
一旦離開A::foo()
的范圍就會被銷毀。 並且 lambda 中的引用將是一個懸空引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.