pointer funktioniert nach return nichtmehr



  • Hi!

    Ich verwende Klasse, die unter anderem einen Pointer auf ein
    int array enthält zusammen mit einem Wert, der angibt wie lange das Array ist.

    Ich rufe in der main Methode eine Funktion auf, die eine neue
    Instanz dieser Klasse erstellt, das Array füllt und dann einen Zeiger
    auf die Instanz ausgibt.
    Innerhalb dieser Funktion enthält das Array noch sinnvolle Werte,
    in der Main nicht mehr - warum ???

    Beispiel:

    class data{
      int * arr;
      int arrlength;
      data data::inverse(void);
      void data::print();
    };
    data::inverse(void){
      data b();
      //tue irgendwas um b zu füllen
      b.print(); //gibt array aus hier noch alles gut!!!
      return b; // :) 
    }
    

    die Main:

    int main(void){
      data a();
      data b = a.inverse();
      b.print(); //Schrott irgendwelche zufälligen Zahlen
      //ARGH! :( 
    }
    

    Grüße,
    Raphael



  • Ich nehme mal stark an, dass das nicht der 'echte' Code ist, sondern Du nur ein Minimalbeispiel konstruieren wolltest, oder? (keine Unterscheidung von private/public, usw.)
    Deswegen meine Frage: Wie sieht's mit Copy-/Zuweisungskonstruktor bzw. Destruktor aus? Da Du mit dynamisch reservierten Speicher innerhalb der Klasse hantierst, wirst Du wohl brauchen und ich vermute, dass irgendwo da der Fehler liegt.
    (z.B. wird 'b' ja am Ende der Funktion inverse wieder zerstört. Wenn jetzt ein Destruktor vorhanden ist, aber kein Copykonstruktor, zeigt der Zeiger der Klasse auf nicht mehr reservierten Speicher.)



  • Würde mich wundern, wenn der Code überhaupt kompiliert, denn

    data a();
    

    ist der Prototyp einer Funktion a ohne Parameter, die ein data-Objekt zurückgibt!



  • Mach das () hinter den Instanzen bei deren Erzeugung weg und gib den korrekten Rückgabewert von data::inverse bei deren Implementierung an. Dann sollte das eigentlich auch funktionieren. Wenn nicht, dann schau dir Asgard's Post nochmal genau an.



  • Dankeschön,
    das war tatsächlich nur ein minimal Beispiel und über Copykonstruktor/
    Destruktoren hab ich mir noch gar keine Gedanken gemacht. Das mach
    ich jetzt. 💡 schönes WE noch,
    Raphael


Anmelden zum Antworten