Zugriffsverletzung beim Schließen...



  • Hi! Ich brauche mal die Hilfe von den Profis unter euch 😉

    Ich erhalte beim schließen meines Programmes immer die Meldung "Zugriffsverletzung bei Adresse [...] in Modul 'BORLNDMM.dll'. Schreiben von Adresse[...]"

    Ich kann damit leider nicht viel anfangen...
    worauf deutet dieser Fehler hin? Muss ja was mit den Zeigern zu tun haben oder?

    Wie kann ich den Debugger hier geschickt verwenden um den Fehler zu finden...

    Hier mal ein kleiner Ausschnitt von meinem Programm

    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "CGAUGES"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    bool *color;
    TStringList *adds;
    TStringList *searchwords;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    
    adds = new TStringList;  
    searchwords = new TStringList;
    
    color = new bool(adds->Count); <-- soll so groß werden wie adds, adds wird natürlich vorher gefüllt
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    delete searchwords;
    delete adds;
    delete color;        
    }
    //---------------------------------------------------------------------------
    

    So ganz kurz und knapp das wo ich mir vorstellen könnte das der Fehler liegt...

    Muss jetzt halt wissen wie ich vorgehen kann um den Fehler zu finden...

    Kann es vll sein das ich möglichst schnell den dynamischen Speicher wieder löschen muss??

    Schonmal vielen vielen Dank für die Antworten!!!!!!! 🙂 🙂



  • Hallo,

    Hier gibt es gleich mehrere Fehler bzw. Probleme.
    1. Du solltest deine Variablen zu Member deiner Formklasse machen (möglichst private)
    2. Das Gegenstück zu OnCreate heißt OnDestroy und nicht OnClose. Letzendlich ist aber auch OnCreate/OnDestroy ungünstig. Am Besten holt man den Speicher im Konstruktor und gibt ihm im Destruktor (mußt du selber schreiben) wieder frei.
    3. Das hier

    color = new bool(adds->Count);
    

    ist falsch. Hiermit erzeugst du einen Pointer auf ein bool und nicht auf ein bool-Array. Das geht dann so

    color = new bool[adds->Count];
    

    In diesem Fall muß das delete dann aber so aussehen

    delete[] color;
    


  • Hallo

    Und wenn du jetzt noch statt dem C-Array ein std::vector<bool> nimmst kannst du dir die manuelle Speicherverwaltung ganz sparen.
    Und für adds, searchwords kannst du auch std::vector<AnsiString> benutzen, wenn du nicht spezielle TStringList-Funktionen brauchst.

    bis bald
    akari



  • Wenn er doch aber C-Arrays und Pointer lernen will. 🙂


Anmelden zum Antworten