考虑以下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相当新,所以我的理解可能不正确。
答案 0 :(得分:4)
您的理解是正确的。
此外,如果复制lambda对象(作为将其包装在std::function<void()>
中的一部分),那么这也将增加引用计数(并在销毁副本时减少它)。