Ich erstelle ein Rückrufsystem mit std::function
und std::map
s. Die Karte verwendet int
s als Schlüssel und die Werte sind std::function
. Ich binde Methoden in diese Funktionen. Ich frage mich, ob ich map.erase(i)
anrufen, wird das die std :: -Funktion aus dem Speicher löschen, oder werde ich ein Speicherleck haben? HierEntfernen von std :: function Lambda-Wrapped-Methode von Std :: Karte
ist einige Beispiel-Code:
#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
};
Ist die letzte test_map.erase(1);
die std::function
aus dem Speicher entfernen?
Das einzige, was in diesem Code zu beachten ist, ist zwischen 'delete test;' und 'test_map.erase (1);' wobei das Lambda auf einen ''th'-Zeiger verweist. In diesem Beispiel ist dies nicht schädlich, aber "wachsende" Anwendungen oder Multithread-Anwendungen könnten unbestimmtes Verhalten zeigen. Im Allgemeinen gibt es ein seltsames Lebenszeitproblem im Code, das durch das Speichern von TestClass in der Map anstelle von Lambda gelöst werden könnte. – stefaanv