将 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()>
中的一部分),那么这也会增加引用计数(并在副本被销毁时减少它)。
考虑以下 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()>
中的一部分),那么这也会增加引用计数(并在副本被销毁时减少它)。