Frage

Ich erhalte eine Fehlermeldung - Heapbeschädigung kann, warum nicht herausgefunden.

Meine Base:

h:

class Base
{
public :
    Base(char* baseName, char* cityName);
    virtual ~Base();

    list<Vehicle*>::const_iterator GetEndList();
    void PrintAllVehicles(ofstream &ResultFile) const;
    char* GetBaseName() const;
    char* GetLocation() const;
    void InsertNewVehicleToBase(Vehicle* newVehicle);
    list<Vehicle*>::const_iterator FindVehicle(char* id);
    void RemoveVehicle (list<Vehicle*>::const_iterator beg);



 private:
    char* m_name;
    char* m_location;
    list<Vehicle*> m_baseVehicles;

};  

cav:

Base::Base(char* baseName, char* cityName)
{
    m_name = new char [strlen(baseName)+1];
    strcpy(m_name, baseName);
    m_location = new char [strlen(cityName)+1];
    strcpy(m_location, cityName);
}

Base::~Base()
{
    delete [] m_name;
    delete [] m_location;
    //m_baseVehicles.clear();
}

Armee destructor:

Army::~Army()
{
    list<Base*>::iterator baseIter = m_basesList.begin();
    for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
        delete (*baseIter);
    m_basesList.clear();
 }  

Was mache ich falsch?

War es hilfreich?

Lösung

Es gibt nichts, offensichtlich falsch mit dem Code, den Sie gezeigt haben, so stehen die Chancen, dass der Fehler im Code ist, haben Sie nicht gezeigt.

Die meisten sofort misstrauisch, was zu mir ist, dass die Base Klasse besitzt zwei Zeiger und haben keine Kopie Konstruktor oder Zuweisungsoperator definiert. Dies bedeutet, dass sollten Sie jemals ein Base Objekt kopieren, werden Sie mit zwei Base am Ende Objekte auf die gleichen Daten zeigen, und wenn sie zerstören, werden sie es zweimal löschen, Heapbeschädigung verursacht.

Die Army Klasse kann auch dieses Problem auch (da es mehrere Base Zeiger besitzt), aber Sie zeigen nicht die Definition der Klasse, so ist es nicht klar, ob es einen Kopierkonstruktor und Zuweisungsoperator hat oder nicht.

Schließlich haben Sie nicht gezeigt, wo die Base Objekten zugeordnet werden. Ist es möglich, dass sie in ein Army Objekt übergeben werden, und auch irgendwo außerhalb des Army Objekt gelöscht? Oder vielleicht die Base* vom Army Objekt enthalten sind, die sich auf Objekte auf dem Stapel, die nicht gelöscht werden sollte?

Andere Tipps

Sichtbare Probleme mit diesem Code:

  • Verwendung von char * nicht std :: string erfordert manuelle Speicherverwaltung
  • Die Verwendung von roh Zeiger in STL-Containern overcomplicates Bereinigungscode
  • Verwendung von CRT für String-Manipulation ist ein C ++ Code Geruch '

Nichts falsch mit dem Stück Code gegeben. Aber mit dieser Art von Code, gibt es eine hohe Möglichkeit von mutiple Deletion, ich deletin einen Speicherblock bedeuten zweimal Das führt zu Heapbeschädigung.

Sie haben nicht den Teil des Codes schreiben, der das Problem hat, weil alles, was ziemlich normal aussieht. Allerdings ist es eine Menge von const-Korrektheit Probleme bekommen:

Base(char* baseName, char* cityName);

Strings sollte als const char* weitergegeben werden, wenn sie geändert werden.

virtual ~Base();

Keine Ahnung, ob diese Bedürfnisse virtual sein; kann nicht sehen, was ihre Unterklassen sind.

list<Vehicle*>::const_iterator GetEndList();

Sollte eine konstante Methode sein, da es sich um ein const_iterator ist: list<Vehicle*>::const_iterator GetEndList() const;

char* GetBaseName() const;
char* GetLocation() const;

Diese sollten const char* zurückkehren, da der Code wird geändert nicht eingerichtet, um den Namen und den Ort zu behandeln.

list<Vehicle*>::const_iterator FindVehicle(char* id);

Auch hier soll eine konstante Methode sein: list<Vehicle*>::const_iterator FindVehicle(char* id) const;

Base::~Base()
{
    delete [] m_name;
    delete [] m_location;
    //m_baseVehicles.clear();
}

Sie m_baseVehicles.clear(); nicht brauchen, weil es trotzdem gleich nach dem destructor passiert. Allerdings müssen Sie die Fahrzeuge löschen, wenn sie nicht an anderer Stelle verwiesen wird, oder du wirst ein Leck bekommen.

  

Armee distructor:

"destructor". Und wo ist der Rest von Army?

Army::~Army()
{
    list<Base*>::iterator baseIter = m_basesList.begin();
    for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
        delete (*baseIter);
    m_basesList.clear();
 }  

Auch hier brauchen Sie nicht m_basesList.clear();.

Ich sehe kein Problem. So wie Matt Kane sagte, wie funktioniert es bevölkert werden?

Heap Verfälschungen kommen aus mehr Daten in einem zugewiesenen Heap-Zelle kopieren als der Speicher der Zelle zugeordnet. Der Anfang und das Ende der Heap-Zellen enthalten Daten, als wenn überschrieben wird als Heapbeschädigung gemeldet werden.

Sie haben nicht alle den Code geschrieben und ich kann nicht ein Problem in dem Code sehen Sie gebucht haben, aber ich würde Ihnen raten, einen Memory-Tool wie Valgrind mit Ihnen helfen, das Problem zu diagnostizieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top