我使用std::function
和std::map
s创建了一个回调系统。该地图使用int
s作为关键字,值为std::function
。我将方法绑定到这些函数中。我想知道如果我打电话给map.erase(i)
,是否会从内存中删除std :: function,还是会出现内存泄漏?从std :: map中删除std :: function lambda-wrapped方法
下面是一些示例代码:
#include <iostream>
#include <functional>
#include <map>
using namespace std;
class TestClass{
public:
TestClass(int _i, map<int, function<void()>>& test_map):i(_i){
test_map[i]=[&](){this->lambda_test();};
};
void lambda_test(){cout << "output" << " " << i<< endl;};
private:
int i;
};
int main() {
map<int, function<void()>> test_map;
TestClass* test = new TestClass(1, test_map);
test_map[1]();
delete test;
test_map.erase(1); // <-- here
};
是否最后test_map.erase(1);
从内存中删除std::function
?
在这段代码中唯一需要注意的是在'delete test'和'test_map.erase(1)'之间,lambda引用一个悬挂的''''''指针。在这个例子中,这并不是有害的,但'成长中'的应用程序或多线程应用程序可能会开始显示未定义的行为。通常,代码中存在一个奇怪的生命期问题,可以通过在地图中存储TestClass而不是lambda来解决。 – stefaanv