Problem bei Behältern: *** *** glibc detektiert free (): ungültige Zeiger: 0x41e0ce94 ***

StackOverflow https://stackoverflow.com/questions/751940

  •  09-09-2019
  •  | 
  •  

Frage

Ich habe ein C ++ Programm unter Linux, die nach einiger Zeit mit der Meldung stürzt ab:

*** glibc detected *** free(): invalid pointer: 0x41e0ce94 ***

Innerhalb des Programms mache ich extensiven Einsatz von Containern. Sie haben Objekte einer einfachen Klasse zu speichern.

Bearbeiten 2009.04.17:

In der Zwischenzeit scheint es klar, dass der Fehler nichts mit der einfachen Klasse zu tun hat. Der Fehler tritt immer noch, wenn ich die Behälter ändern andere Datentypen zu halten. Das Problem muss woanders in meinem Code, ich versuche es zur Zeit, um herauszufinden, ...

War es hilfreich?

Lösung

Betrachten wir ein std :: string mit dem String-Wert zu halten, statt eines rohen char-Zeiger. Dann werden Sie nicht um die Verwaltung der String-Daten in Ihren Auftrag, kopieren und Vernichtungsmethoden kümmern. Wahrscheinlich Ihr Problem liegt dort.

Edit: Es gibt kein Problem mit der neueren Klasse Sie auf dem Laufendes, und kein Problem mit der ersten Version, wenn Sie nur die char * mit auf String-Konstanten zu zeigen. Das Problem liegt an anderer Stelle im Programm oder mit der Art und Weisen Sie die Klasse verwenden. Du musst mehr Zeit damit verbringen, in dem Debugger Graben und / oder valgrind das Problem aufzuspüren. Ich würde herausfinden, was zu an der angegebenen Adresse gerichtet ist, und versuchen, festzustellen, warum es zweimal freigegeben wird.

Andere Tipps

Bei einer Vermutung, es ist etwas falsch in Ihrer Kopie Ctor, Zuordnung op oder destructor -. Sie den Code für die zeigen müssen

Edit: Just bemerkt, dass Sie einen Zuweisungsoperator nicht haben - Ihr Copykonstruktor & destructor vorausgesetzt OK sind, benötigen Sie einen Zuweisungsoperator auch als std :; Container werden sie verwenden.

Ich habe mit einer C / C ++ Anwendung kämpfen wir entwickeln und die ersten Ideen, die mir in den Sinn kommen, sind

  • Ein Zeiger wurde modifiziert und sein zeigt auf eine ungültige possition (ptr ++;) oder so ähnlich
  • .
  • Sie haben das Objekt freigegeben, aber der Zeiger hält immer noch die Richtung an.

    Ein Werkzeug wie Valgrind helfen können mögliche Fehler im Code zu erkennen. So installieren Sie:

    sudo apt-get install valgrind

    Und es zu verwenden:

    valgrind --tool = memcheck --leak-check = full ...

    Es wird Fehler berichten, während das Programm ausgeführt wird, und es wird Ihnen auch einen Bericht geben, nachdem das Programm beendet. Das einzige Problem ist, was valgrind identifiziert als ein mögliches Problem kein wirkliches Problem sein kann. Aber es ist ein Ausgangspunkt.

Es ist sicherlich ein schlechter String-Wert. Mit std :: string vielleicht in dieser Hinsicht helfen, wenn es ein baumelnden Zeiger Problem. Auch sicherstellen, dass alle die Zeichenfolge Initialisierungen wie erwartet.

Wenn ich die Klasse richtig verstehen, übernehmen Sie, dass unabhängig von Speichern an m_cstring wohnt nicht für die gesamte Lebensdauer der Klasse freigegeben werden. Welche in Ihrem Fall bedeutet auch für die Lebensdauer der Behälter. Überprüfen Sie die Bereiche.

Ein weiteres Problem, das Sie können zu begegnen ist, wenn Ihr Destructor ist Löschen der cstring dann ein Standardwert im Konstruktor ist eine wirklich schlechte Idee, wie Sie eine statisch zugewiesene cstring ausplanen wird versuchen.

Es ist möglich, in C ++ eine Funktion zu definieren, die einen String zurück soll, aber nichts zurück, und Sie mit einem schlechten Schnur aufzuwickeln (In der Regel wird der Compiler die ‚Ende erreicht Nicht-Leere Funktion‘ catch , aber nicht immer).

Ditto auf valgrind verwendet wird.

Als Nachtrag nach verschiedenen Kommentaren zu lesen, gibt es immer die Möglichkeit, dass ein Speicherfehler irgendwo anders im Programm beschädigt eine der Saiten.

Bearbeiten 16.04

An dieser Stelle möchte ich die Werte des Objekts überprüfen sind gut auf Konstrukt / Destruct gebildet. (Versuchen, sie zu drucken?) Wenn alles gut aussieht, können Sie an anderer Stelle in Ihrem Code für den Fehler suchen.

Was ist in Ihrem destructor? Wahrscheinlich tut es frei von dem cstring. Und wenn es der Fall ist, dann teilen Sie Ihre cstring Zeiger über Instanzen und jede Instanz dann befreit den gleichen Zeiger.

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