Problem mit Lambda Funktionen
-
Hallo Forum!
Ich habe den folgenden Code geschrieben:
#include <iostream> #include <functional> class foo; foo *f; class foo { std::function<void()> bar; public: foo(std::function<void()> bar) : bar(bar) { f = this; } void run() { bar(); } }; int &func() { int *i = new int; std::cout << i << std::endl; new foo ([&] { *i = 42; std::cout << i << std::endl; }); return *i; } int main() { int &i = func(); f->run(); std::cout << &i << std::endl; return 0; }In func() alloziere ich dynamisch einen Integer und gebe dessen Adresse aus. Diesen Zeiger capture ich in der Lambda Funktion. Wenn diese nun ausgeführt wird und die Adresse ausgegeben wird, sehe ich eine andere Adresse als vorher. Woran liegt das?
Die Ausgabe lautet zum Beispiel:
% g++ -std=c++11 -Wall -Werror -g test2.cpp && ./a.out 0x1c56010 0x1c56050 0x1c56010Vielen Dank im Voraus!
-
Du hast im closure-Objekt eine dangling reference auf den Zeiger i. Der Zeiger selbst ist lokal in der Funktion
func, und du hast ihn implizit by reference gecaptured.Ändere den capture-default zu =, dann sollte es klappen.
-
Siehe auch hier: https://ideone.com/qHZA5U
-
Ach, natürlich!
Danke!
