【发布时间】:2015-04-22 22:29:40
【问题描述】:
考虑以下 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 还很陌生,所以我的理解可能不正确。
【问题讨论】:
-
shared_ptr(实际上是所有智能指针)的要点是它不会让您泄漏内存或导致内存管理错误。 (shared_ptr对此规则有一个特殊的例外,即循环引用,但这里不会发生这种情况。)
标签: c++ lambda shared-ptr pass-by-value reference-counting