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

时间:2015-02-21 05:51:02

标签: c++ lambda shared-ptr pass-by-value reference-counting

考虑以下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的引用计数会减少。然后在func()中执行f()后,shared_ptr的引用计数再次递减。所以我认为这段代码保持了引用计数的平衡(两个增量和两个减量)。但是,我对shared_ptr和lambdas相当新,所以我的理解可能不正确。

1 个答案:

答案 0 :(得分:4)

您的理解是正确的。

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