char-Variable - Zugriffsverletzung-Leseposition



  • Hallo,

    vorab, ich bin nicht gerade der beste in c-programmieren.
    Nun sitze ich jetzt schon 2 Tage an einem Problem.

    Ich hab eine Variable vconf, die ich in meiner Funktion mit
    einem String füllen will. Jedoch erscheint beim Ausführen folgende
    Fehlermeldung:

    Unbehandelte Ausnahme bei 0x0046868e in MeinProg.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xcdcdcdd9.

    und er verweist auf strcpy und auf xsize und ysize und zoom.

    Was mach ich falsch?
    Alles andere geht.

    Der Quellcode:

    //Init_App-header
    class Init_App
    {
    public:
      Init_App();
      void Init_Grab_Size(unsigned char taste);
    
      int xsize;
      int ysize;
      int zoom; //1 normal/2 2time/3 3time
    
      char *vconf;
      ...
    };
    
    //Init_App.cpp
    Init_App::Init_App()
    {
      vconf = new char[34];
      .....
    }
    void Init_App::Init_Grab_Size(unsigned char taste)
    {
     switch (taste) {
       case '1' :
         strcpy( vconf, "-width=192 -height=144 -channel=1" );
         xsize = 192;
         ysize = 144;
         zoom = 4;
       break;
         ......
       default:
         strcpy( vconf, "-width=384 -height=288 -channel=1" );
         xsize = 384;
         ysize = 288;
         zoom = 2;
      }
    }
    


  • Heißt die Klasse nun Init oder Init_App?



  • Sorry, sie heißt Init_App!
    Habs schnell geändert!



  • Erstellst du eine Instanz von Init_App? Oder rufst du Init_Grab_Size vielleicht über einen wilden Zeiger auf?



  • Ich benutze eine Instanz von Init_App in einer anderen funktion wo sie aufgerufen wird.

    //im Konstruktor der Klasse
    Init_App* m_init_app;
    m_init_app = new Init_App;
    
    //in der Funktion
    m_init_app->Init_Grab_Size(taste);
    


  • Sehe ich das richtig, dass du im Konstruktor der Klasse einen lokalen Init_App-Zeiger anlegst, der genauso heißt wie die Instanzvariable, die du in der Funktion benutzt?



  • Wenn ich dich richtig verstanden habe ja.



  • Aloha,

    insofern mir noch die Grundregeln bekannt sind,
    sollte Dein Zeiger weg sein, sobald der Konstruktor durchlaufen ist, soll heißen

    m_init_app
    

    ist wech, wenn Du in Deiner Funktion zugreifst.

    Mache ihn als Membervariable Deiner Oberklasse und initialisier ihn nur im Konstruktor !!!

    m_init_app = new Init_App;
    

    Dann sollte es funzen.

    Grüße

    BOA



  • Wenn in deinem Konstruktor wirklich steht:

    Init_App* m_init_app;
    

    dann verdeckt diese lokale Variable die gleichnamige Instanzvariable. Die lokale Variable wird zerstört, sobald der Konstruktor beendet ist, die Instanzvariable bleibt uninitialisiert.
    Lass die Zeile einfach weg, oder noch besser, verwende eine Initialisierungsliste, dann kann dir das nicht mehr passieren:

    DeineKlasse::DeineKlasse() : m_init_app(new Init_App)
    {
        // ...
    }
    


  • Also das

    m_init_app = new Init_App;
    

    in den Konstruktor der Klasse wo ich es verwenden will.

    Und

    Init_App* m_init_app;
    

    als Member in meine Init_App Klasse



  • Yupp,

    sollte funzen.

    Aber die Variante von MFK finde ich schöner, wenn sie funzt. Initialisierungsliste, da war doch mal was...

    Teste mal MFk´s und schrieb mal ob sie funzt....

    Grüße

    BOA



  • die Version von MFk funzt.
    Allerdings hab ich noch ne Frage.
    Kann ich mehrere

    Klasse::Klasse(): m_init_app(new Init_App): m_dialog_app(new Dialog_App)
    

    machen?



  • Ja. Allerdings werden die einzelnen Listenelemente mit Komma getrennt, der Doppelpunkt leitet die Liste nur ein.



  • Danke für Eure Hilfe!

    Komme jetzt wieder ein großes Stück weiter.

    🙂



  • Dank an MFK für das Erinnern an die Initialisierungsliste.

    Grüße

    BOA


Anmelden zum Antworten