簡體   English   中英

在 lambda 中引用共享指針是否會保留對象生命周期?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM