Ich habe ein Callback-System, das Lambda hält, wenn etwas passiert. Um benachrichtigt zu werden, müssen Sie das Lambda für eine Kennung registrieren oder die Registrierung aufheben, wenn Sie nicht erneut benachrichtigt werden möchten.Was genau passiert, wenn ich innerhalb eines Lambda das Objekt lösche, das dieses Lambda enthält?
Das Problem, das ich habe, ist, dass ich lambdas registriert haben, dass auf aufgerufene wird Registrierung von diesem System die Zerstörung des aktuellen Lambda ausgeführt wird. Und ich denke, das ist nicht sicher. Aber ich bin mir nicht sicher.
Vereinfachen zum Beispiel:
#include <map>
#include <functional>
#include <iostream>
int main() {
std::map<int, std::function<void()>> m;
m[10] = [&m]() {
int i = m.size(); // Just cheking the internal state of the lambda
m.clear();
//i += m.size(); // If I uncomment this the std::cout is not working.
std::cout<< "What happens? " << i << std::endl;
};
m[10]();
return 0;
}
Was ich sehe, ist, dass, wenn ich den Zustand des Lambda nach m.clear()
überprüfen, ich seltsame Verhalten bekommen (zum Beispiel std::cout
nicht funktioniert). Kannst du mir erklären, was genau in diesen Fällen passiert?
Wie werden Sie diese Situationen mit Rückrufen umgehen? vor dem Rückruf eine Kopie erstellen (scheint ein No-No)?
Hier kann ich es reproduzieren: http://cpp.sh/2kjzg – FrameBuffer