【问题标题】:C++ memory management when passing shared_ptr to lambda将 shared_ptr 传递给 lambda 时的 C++ 内存管理
【发布时间】: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


【解决方案1】:

你的理解是正确的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2019-02-25
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2017-05-19
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多