我正在使用std::function
和std::map
创建回调系统。地图使用int
作为键,值为std::function
。我将方法绑定到这些函数中。我想知道我是否会调用map.erase(i)
,是否会从内存中删除std :: function,还是会有内存泄漏?
以下是一些示例代码:
#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
?
答案 0 :(得分:3)
虽然这不是好代码,但没有内存泄漏;您将std::function
存储在std::map
中的值(而不是指针),因此std::map::erase
将调用std::function
的析构函数。
换句话说,您不是new
任何std::function
,因此您无需delete
任何std::function
。
答案 1 :(得分:1)
关于lambdas在实际内存分配方面的内容有一个非常好的解释:
https://stackoverflow.com/a/12203426/1230538
据我了解,lambda语法创建一个r值,复制(以及任何捕获的状态等)到std :: function中。这将被std :: function的析构函数删除,当你调用erase时(和/或当地图超出范围时)由std :: map的析构函数调用。