Was kann die Ursache für segmentation fault mittels delete-Befehl in C++?

Ich habe ein Programm geschrieben, das ordnet ein neues Objekt der Klasse T, wie diese:

T* obj = new T(tid);  

wo das tid ist ein int

Woanders in meinem code versuche ich das Objekt freigeben, das hab ich zugeteilt, die in einem Vektor, mit:

delete(myVec[i]);  

dann:

myVec[i] = NULL;

Manchmal geht es ohne Fehler, und in einigen Fällen verursacht ein crash—ein segmentation fault.

Habe ich überprüft vor dem Aufruf löschen, und das Objekt ist da—ich habe Sie nicht gelöscht, es an anderer Stelle vor.

Was kann die Ursache für diesen Absturz?

Das ist mein code für das einfügen von Objekten vom Typ T auf den Vektor:

_myVec is global

int add() {     

int tid =  _myVec.size();  
T* newT = new T (tid);  
    if (newT == NULL){  
        return ERR_CODE;  
    }  
    _myVec.push_back(newT);  
// _myVec.push_back(new T (tid));  

    return tid;  
} 

als es ist - das Programm manchmal abstürzt.

Wenn ich die Stelle des push_back Zeile mit dem Kommentar, und lasse den rest so wie es ist-es funktioniert.

aber wenn ich ersetzen Sie diesen code mit:

int add() { 

int tid =  _myVec.size();  
    if (newT == NULL){  
        return ERR_CODE;  
    }  
    _myVec.push_back(new T (tid));  

    return tid;  
}  

stürzt es in einem anderen Stadium...

die newT-in der zweiten option ist unbenutzt und noch - änderungen, die den gesamten Prozess... was ist hier Los?

  • Sind Sie sicher, dass die index-Punkt auf gültige array-Element?
  • Um diese Frage zu beantworten, müssen wir die definition von myVec und wie Sie das einfügen von Elementen in es.
  • Dies könnte durch so ziemlich jede Art von Zeiger-Fehler oder buffer-overflow, so dass nur die Informationen, die Sie Gaben nicht helfen, das problem zu finden. Sie haben Zugriff auf ein tool wie Valgrind?
  • Wenn das ist ein STL-Vektor verwenden erase oder std::remove statt ... müsste mehr relevanten code und oder callstack zu wissen, was verkehrt ist.
  • vielleicht wollen Sie auch zu prüfen, ob der Fehler Auftritt, in den Destruktor.
  • Ich verstehe nicht, unabhängig von der seg. Fehler - was ist der Unterschied zwischen den drei Optionen mit push_back, die habe ich oben erwähnt, und warum jede von Ihnen die Ursache für das unterschiedliche Verhalten des Programms?

InformationsquelleAutor Zach | 2011-03-22
Schreibe einen Kommentar