std::function
과 std::map
을 사용하여 콜백 시스템을 만들고 있습니다. 지도는 int
을 키로 사용하며 값은 std::function
입니다. 나는 그 함수에 메소드를 묶는다. map.erase(i)
을 호출하면 메모리에서 std :: function을 삭제할 것인가, 아니면 메모리 누수가 발생합니까?std :: function 람다 랩핑 된 메소드를 std :: map에서 제거하기
#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);'사이에 있으며, 여기서 람다는 매달려있는'this' 포인터를 참조하고 있습니다. 이 예에서는 유해하지 않지만 '증가하는'응용 프로그램이나 멀티 스레드 응용 프로그램은 정의되지 않은 동작을 시작할 수 있습니다. 일반적으로 람다 대신 맵에 TestClass를 저장하여 해결할 수있는 이상한 평생 문제가 있습니다. – stefaanv