lamda表示使用[=]捕获,或者使用[&],或者捕获了智能指针shared_ptr,则会在闭包中保存一个引用,也就是增加了智能指针的引用计数,
一不小心,就会造成内存泄露,解决发方法是:
- 将保存lamda表达式发回调函数变量设置为nullptr;
- 比如下面代码: manager->cb = nullptr;
备注:shared_ptr::reset()可以设置智能指针为空。
#include <iostream>
#include <memory>
#include <functional>
using namespace std;
class A
{
public:
A()
{
}
~A()
{
printf("delete A\n");
}
int a = 9;
};
using DefaultCallBack = std::function< void(int)>;
class Manager
{
public:
int b = 6;
void func1()
{
if (cb)
{
cb(b);
}
}
DefaultCallBack cb = nullptr;
};
std::shared_ptr<Manager> manager = std::make_shared<Manager>();
void test1()
{
std::shared_ptr<A> A1 = std::make_shared<A>();
printf("use count of A1 = %d\n", A1.use_count());
// will see "delete A"
}
void test2()
{
std::shared_ptr<A> A1 = std::make_shared<A>();
manager->cb = [=](int status)
{
printf("A1.a = %d \n", A1->a);
};
manager->func1();
// can't see "delete A"
}
void test3()
{
std::shared_ptr<A> A1 = std::make_shared<A>();
manager->cb = [=](int status)
{
printf("A1.a = %d \n", A1->a);
};
manager->func1();
manager->cb = nullptr; // this is important
}
int main()
{
test1();
test2();
test3();
char c;
std::cin >> c;
}