将shared_ptr传递给lambda时的C ++内存管理

Sun*_*day 5 c++ lambda reference-counting pass-by-value shared-ptr

考虑以下C ++代码:

void f(std::function<void()> func) {
    func();
}

void g(std::shared_ptr<MyObject> myObjPtr) {
    myObjPtr->someMethod();
}

void h(std::shared_ptr<MyObject> myObjPtr) {
    f([=](){ g(myObjPtr); });
}
Run Code Online (Sandbox Code Playgroud)

是否有内存泄漏?

我的理解被myObjPtr复制到了lamba中,并增加了其引用计数。然后将其复制到g()参考计数再次增加的位置。当g()完成后,shared_ptr有递减引用计数。然后,后func()在执行f()shared_ptr有引用计数再次递减。所以我认为这段代码使引用计数保持平衡(两个增量和两个减量)。但是,我对shared_ptrlambda并不陌生,因此我的理解可能不正确。

use*_*751 5

您的理解是正确的。

同样,如果复制了lambda对象(std::function<void()>可能是将其包装的一部分),那么这也会增加引用计数(并在销毁副本时将其减少)。