Fehlermeldung bei Speicherfreigabe von Struktur-Instanz



  • Hallo,

    ich kann mein Objekt myEigenschaften nicht freigeben.

    Also, ich habe folgende Struktur:

    struct Eigenschaften
    	 {
    		 char*					vnr;
    		 char*					name;
    		 long					para;
    	 } ;
    

    Mit

    public:
    		CFremdeKlasse::Eigenschaften *myEigenschaften;
    

    erstelle ich eine Public-Instanz in der Header-Datei.

    Da ich Datensätze aus einer XML-Datei in die Struktur einlesen möchte, erstelle ich eine dynamsiche Liste:

    myEigenschaften = (CFremdeKlasse::Eigenschaften*) malloc(iCountXML * sizeof(CFremdeKlasse::Eigenschaften));
    

    und durchlaufe das XML-Dokument zeilenweise.
    Dabei weise ich die Werte zu:

    for (int i = 0; i < anzahl; i++)
    	{
    		myEigenschaften[i].name = "Name";
    		myEigenschaften[i].vnr  = "Vnr";
    		myEigenschaften[i].para = "Para";
    	}
    

    Das funktioniert alles.

    Wenn ich allerdings mit

    if(myEigenschaften)
    		free(myEigenschaften);
    

    den Speicherplatz wieder freigeben möchte, bekomme ich die Fehlermeldung, dass auf den reservierten Speicherbereich nicht zugegriffen werden kann.

    Irgendwo muss noch eine Referenz auf myEigenschaften sein...??

    cu
    Chris


  • Mod

    1. Welche Fehlermeldung bekommst Du exakt?
    2. vnr und name sind auch Zeiger! Du allokierst hier aber nichts.
    3. iCountXML benutzt Du für die Speicherreservierung, aber ist anzahl wirklich der gleiche Wert?
    4. Würde ich Dir raten mit new/delete zu arbeiten, wenn Du schon C++ verwendest.



  • Ich habe den Fehler zwar gefunden - es lag daran, dass ich im iCountXML mit 0 initialisiert hatte.

    Allerdings habe ich das Problem, dass ich erst zur Laufzeit die Array-Größe bestimmen kann - ist ja abhängig von der Anzahl der XML-Datensätze..

    Momentan muss ich die XML-Datei 2x durchlaufen:
    1. zum Ermitteln der Datensatz-Anzahl für die Speicherreservierung
    2. zum Ablegen der XML-Felder vnr, name und para ins Array

    Gibt es keine Möglichkeit iCountXML zur Laufzeit zu erzeugen?


  • Mod

    1. kannst Du std::vector verwenden, dann kannst Du einfach mit push_back einen neuen Member hinzufügen. Das geht auch mit CArray
    2. Kannst Du auch mit new dynamisch einen Array allokieren.
    3. Was meinst Du mit "iCountXML zur Laufzeit zu erzeugen"? Das ist eine Variable, die Du zu jeder Zeit mit jedem beliebigen Wert befüllen kannst.



  • Den Hinweis, std::vector statt eines manuell erzeugten Arrays kann ich nur unterstützen. Ausserdem solltest du in der Struktur Eigenschaften std::string statt char Pointer benutzen:

    #include <string>
    
    struct Eigenschaften
    {
       std::string vnr;
       std::string name;
       long para;
    };
    

    Es sei denn, du willst einen hochperformanten Parser für dein Dateiformat schreiben, in der keine Kopien der Einstellungen erzeugt werden, sondern Zeiger auf die entsprechenden Daten und damit Zeit und Speicherplatz sparen.


Anmelden zum Antworten