Anzeige:
Ergebnis 1 bis 7 von 7

Thema: delete[] nicht möglich

  1. #1
    Registrierter Benutzer
    Registriert seit
    23.03.2008
    Beiträge
    50

    delete[] nicht möglich

    Hi,

    ich habe folgenden Code geschrieben:

    Code:
    double** CMOKEAUSWERTData::curve;
    
    CMOKEAUSWERTData::CMOKEAUSWERTData(){
    	curve = new double*[10000];
    	
    	for(int i=0; i<10000; i++)
    		curve[i] = new double[2];
    
    }
    
    CMOKEAUSWERTData::~CMOKEAUSWERTData(){
    	for(int i=0; i<10000; i++)
    		delete[] curve[i];
    	delete[] curve;
    }
    Wird auch alles schön kompilliert, aber beim ausführen hängt er am destruktor. Fehler: invalid pointer. Was ist das Problem?

    Hinweis: Ich benutze CMOKEAUSWERTData nur als virtuelle Klasse.

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Du hast zu wenig Code gepostet um eine sichere Aussage treffen zu können. Vermutlich erzeugst du erst ein CMOKEAUSWERTData Objekt und dann ein weiteres. Später wird das erste Objekt abgebaut. Der Destruktor löscht den Speicher auf den das statische Element CMOKEAUSWERTData::curve zeigt. Dieses wird dadurch ungültig. Dann wird das zweite Objekt abgebaut, diesmal trifft der Destruktoraufruf auf den ungültigen Zeiger und du bekommst die Meldung die du genannt hast.

    Warum initialisierst du ein statisches Element im Konstruktor?

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.03.2008
    Beiträge
    50
    Zitat Zitat von locus vivendi Beitrag anzeigen
    Warum initialisierst du ein statisches Element im Konstruktor?
    Das ist vielleicht nicht der beste Stil, aber für das Programm im Prinzip egal soweit ich das sehe, da nur eine Methode folgt die diese Variable benutzt.


    Zitat Zitat von locus vivendi Beitrag anzeigen
    Du hast zu wenig Code gepostet um eine sichere Aussage treffen zu können. Vermutlich erzeugst du erst ein CMOKEAUSWERTData Objekt und dann ein weiteres. Später wird das erste Objekt abgebaut. Der Destruktor löscht den Speicher auf den das statische Element CMOKEAUSWERTData::curve zeigt. Dieses wird dadurch ungültig. Dann wird das zweite Objekt abgebaut, diesmal trifft der Destruktoraufruf auf den ungültigen Zeiger und du bekommst die Meldung die du genannt hast.
    Wie schon erwähnt benutze ich CMOKEAUSWERTData nur als virtuelle Klasse. Von der abgeleiteten Klasse erzeuge ich ein Objekt, rechne damit und lösche es wieder. Danach wird ein neues Objekt erzeut. Code:

    Code:
    	for(int i=0;i<=36;i++){
    
    		filename = HOME + "/daten/moke/" + sample_name + "/" +  sample_name + itos(i) + ".dat";
    
    		commandline = "dos2unix " + filename + "\n";
    
    		system(commandline.c_str());
    		
    		CCalculate *hysteresis = new CCalculate();
    		(*hysteresis).read(filename);
    
    		(*hysteresis).setPhi(i*10);
    
    		output<<(*hysteresis).calculate();
    
    		delete hysteresis;
    	}

    CCalculate ist dabei die abgeleitete Klasse.

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Wie schon erwähnt benutze ich CMOKEAUSWERTData nur als virtuelle Klasse. Von der abgeleiteten Klasse erzeuge ich ein Objekt, rechne damit und lösche es wieder. Danach wird ein neues Objekt erzeut. Code: ...
    Ok, das ist von vornherein betrachtet korrekt, in dem Sinne, das dort kein ungültiger Zeiger gelöscht wird.

    Kannst du vollständigen Beispielcode posten, der das Problem hervorruft? Ohne kann ich leider nicht weiterhelfen.

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.03.2008
    Beiträge
    50
    ich habe das Problem gefunden:

    Ich lösche den array auch im Destruktor der abgeleiteten Klasse. Das kann natürlich nicht funktionieren. Meine Frage hier nur: Wo sollte der array gelöscht werden?

  6. #6
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Bin mir nicht sicher, aber löscht man Vectoren nicht rückwärts um Zeiger verluste zu vermeiden?
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  7. #7
    Registrierter Benutzer
    Registriert seit
    23.03.2008
    Beiträge
    50
    ich lösche sie doch rückwärts. Meine Frage war nicht in welcher Reihenfolge sondern in welcher Klasse.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •