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

C++ memory management when passing shared_ptr to lambda

考虑以下 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); });
}

是否有任何内存泄漏?

我的理解是 myObjPtr 被复制到 lamba 中并增加了它的引用计数。然后它被复制到 g() 中,引用计数再次递增。 g() 完成后,shared_ptr 的引用计数减少。然后在 f() 中执行 func() 之后,shared_ptr 的引用计数再次减少。所以我认为这段代码使引用计数保持平衡(两次递增和两次递减)。但是,我对 shared_ptr 和 lambda 还很陌生,所以我的理解可能不正确。

你的理解是正确的。

此外,如果 lambda 对象被复制(作为将其包装在 std::function<void()> 中的一部分),那么这也会增加引用计数(并在副本被销毁时减少它)。