warum Exeption Zugriffsverletzung



  • Hallo,

    Warum bekomme ich eine Exeption Zugriffsverletzung?

    class abc
    {
          public:
          int x;
          int y;
          int mult(void);
    };
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
         abc *mult1;
         abc *mult2;
         mult1->x = 10;
         mult2->x = 5;
         mult1->y = 10;
         mult2->y = 5;
         int erg1= mult1->mult();
         int erg2= mult2->mult();
    }
    //---------------------------------------------------------------------------
    int abc::mult(void)
    {
         return x*y;
    }
    

    Bin noch C++ Anfänger.



  • ...wirf mal deinen debugger an.

    abc *mult1;
    abc *mult2;
    mult1->x = 10;
    mult2->x = 5;
    

    wo zeigen mult1 und mult2 hin?



  • hermes schrieb:

    Hallo,

    Warum bekomme ich eine Exeption Zugriffsverletzung?

    class abc
    {
          public:
          int x;
          int y;
          int mult(void);
    };
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
         abc *mult1;
         abc *mult2;
         mult1->x = 10;
         mult2->x = 5;
         mult1->y = 10;
         mult2->y = 5;
         int erg1= mult1->mult();
         int erg2= mult2->mult();
    }
    //---------------------------------------------------------------------------
    int abc::mult(void)
    {
         return x*y;
    }
    

    Bin noch C++ Anfänger.

    Weil du multi1 und multi2 nicht initialisiert hast...



  • das mit dem anfänger hatte ich übersehen, sorry.

    ich denke, es liegt daran, dass (im obigen code-snippet von mir) die beiden zeiger nicht korrekt initialisiert wurden. die zeigen ja irgendwo ins nirvana.

    eine lösung wäre:

    abc *mult1 = new abc;
    abc *mult2 = new abc;
    

    dann müsste dein programm laufen (vorausgesetzt sonst ist nichts faul...)

    gruss

    keinerEiner



  • vielen Dank, so Funktioniert es,

    Aber warum abc *mult1 = new abc der * vor mult1?



  • hermes schrieb:

    vielen Dank, so Funktioniert es,

    Aber warum abc *mult1 = new abc der * vor mult1?

    Weil du dadurch einen Pointer definierst.



  • warum überhaupt auf den Heap?

    abc mult1;
         abc mult2;
         mult1.x = 10;
         mult2.x = 5;
         mult1.y = 10;
         mult2.y = 5;
         int erg1= mult1.mult();
         int erg2= mult2.mult();
    

    (abgesehen davon, dass das sowieso schlechter stil ist)



  • interpreter schrieb:

    hermes schrieb:

    vielen Dank, so Funktioniert es,

    Aber warum abc *mult1 = new abc der * vor mult1?

    Weil du dadurch einen Pointer definierst.

    Muss ich das so sehen, das jedes Object der Klasse für sich einen Speicher-
    bereich für die variablen x und y bekommt,und deswegen das Object als Zeiger declariert wird und der Zeiger mult1->x dann auf den Speicherbereich der variable x für Object mult1 zeigt.
    Wenn ja wird dann auch beim aufruf der Funktion mult() ein Zeiger für den
    Variablenraum des Objects mit übergeben?

    Gruß
    Johann



  • hermes schrieb:

    interpreter schrieb:

    hermes schrieb:

    vielen Dank, so Funktioniert es,

    Aber warum abc *mult1 = new abc der * vor mult1?

    Weil du dadurch einen Pointer definierst.

    Muss ich das so sehen, das jedes Object der Klasse für sich einen Speicher-
    bereich für die variablen x und y bekommt,und deswegen das Object als Zeiger declariert wird und der Zeiger mult1->x dann auf den Speicherbereich der variable x für Object mult1 zeigt.

    Gruß
    Johann

    Ja, das haste in etwa schon alles richtig verstanden. Noch mal kurz zusammegefasst:

    abc *mult1 = new abc;
    

    multi ist eine Zeigervariable vom Typ abc und liegt auf dem Stack (wenn multi nicht gerade global ist). "new abc" allokiert Speicher für ein Objekt vom Typ abc im Heap und gibt die Adresse auf den Speicherbereich zurück, der dann der Zeigervariable mutli zugewiesen wird. Es wird übrigens nur Speicher für Member angefordert, jedoch NICHT für Methoden.

    Wenn ja wird dann auch beim aufruf der Funktion mult() ein Zeiger für den
    Variablenraum des Objects mit übergeben?

    multi->mult()
    

    Das hier wird "übersetzt" zu:
    mult(multi) und der Prototyp sieht so aus: int multi(abc* this).
    Es wird also der Funktion einfach ein Zeiger auf das Objekt, für das die Methode aufgerufen wurde, mit übergeben, so dass die Methode weiß, auf welches Objekt sie wirken soll.


Anmelden zum Antworten