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
    0x1c56010
    

    Vielen Dank im Voraus!


  • Mod

    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.


  • Mod

    Siehe auch hier: https://ideone.com/qHZA5U



  • Ach, natürlich! 😃 Danke! 🙂 👍


Anmelden zum Antworten