从std :: map中删除std :: function lambda-wrapped方法

时间:2016-08-22 13:53:57

标签: c++ c++11 memory-leaks lambda std-function

我正在使用std::functionstd::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

2 个答案:

答案 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的析构函数调用。