Frage

Wenn malloc, wenn es einen Core-Dump mit dem Fehler erzeugt:

malloc(): memory corruption: ....... ***

Bedeutet dies, dass malloc versucht, Speicher zu reservieren, die nicht frei war zuzuteilen? Wenn ja, was sind die Ursachen dafür?

War es hilfreich?

Lösung

Es hängt ganz von Ihrer malloc Implementierung, aber in der Regel das, was Mittel ist, dass an einem gewissen Punkt vor etwas zu diesem malloc mehr Daten zu einem malloced Puffer als seine Größe geschrieben.

Eine Menge malloc Implementierungen speichert einen Teil ihrer Daten inline mit ihrem Gedächtnis, mit anderen Worten:

+--------------------------------+
|14 bytes -> Padding             | 
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
|6 bytes -> Your data            |
+--------------------------------+
|8 bytes -> Padding              |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+

Also, wenn ein Code von Ihnen oder einer Bibliothek schreibt 16 Bytes in diesem 6-Byte-Puffer würde es die Polsterung und die 2 Byte interner malloc Informationen überschrieben werden. Das nächste Mal, wenn Sie malloc nennen es wird versuchen, durch seine Daten zu Fuß Raum zu finden, drücken Sie die überschrieben Raum, und es wird unsinnig, da Sie es überschrieben, den Heap korrumpieren.

Je nach Implementierung eines solchen Fehlers auch, indem sie eine doppelte frei verursacht werden könnten.

Andere Tipps

Wahrscheinlich ist dies kein Problem in malloc selbst. Vielmehr ist dies ein Problem mit Ihrer Anwendung zu modifizieren Teilen des Haufens, dass es nicht.

Wenn Sie auf Linux laufen, versuchen Sie es mit Valgrind , um zu sehen, welcher Code Ihr Heap Wegwerfen.

Die übliche Ursache hierfür ist, dass Sie über Daten geschrieben, dass malloc () hast du nicht die Erlaubnis, über zu schreiben - entweder durch Pufferüberlauf (über das Ende des Raumes Schreiben Sie gegeben wurden) oder Buffer-Underrun (Schreiben vor dem Start des Puffers).

Es kann manchmal durch die Befreiung eines Zeigers verursacht werden, die nicht von malloc () zugewiesen wurde et al, oder durch eine erneute Befreiung (Doppel befreiend) einen Zeiger, der von malloc () zugewiesen wurde. Um zum Beispiel einen statischen Puffer zu befreien ist eine schlechte Idee; Sie wird Korruption erhalten.

Sie sollten davon ausgehen, dass das Problem in Ihrem Code ist -. Es extrem unwahrscheinlich ist, ein Problem in malloc sein () et al, und eher unwahrscheinlich, dass in jeder anderen Bibliothek sein, die Sie mit

Es gibt mehrere Dinge, die üblichen Ursachen für Heapbeschädigung sind:

  • die Speicherzuweisung Überholkupplung (Schreiben über das Ende des zugeordneten Block)
  • doppelte Befreiung einen Block
  • mit einem Zeiger, nachdem es befreit worden
  • und natürlich etwas fälschlicherweise über einen Zeiger zu schreiben, die nichts mit einer früheren Zuordnung (a ‚ram Hit‘ oder Rogue-Zeiger) zu tun hat -. Dies der allgemeine Fall ist, dass alle der oben genannten enthält

Diese Probleme können schwierig zu debuggen, weil die Ursache und Wirkung oft durch Zeit und Raum (anderer Bereich des Codes) voneinander getrennt sind. So ist der Fehler nicht bemerkt, bis eine Ewigkeit (in Computerzeit) verstrichen ist, nachdem der Fehler, der das Problem verursacht ausführt.

Sie einen Debug-Heap verwenden kann beim Debuggen dieser Probleme sehr hilfreich sein. Microsofts Compiler haben eine CrtDebug Haufen dass im Debug aktiviert ist Builds (kann aber haben zusätzliche Konfigurationselemente gesetzt). Ich bin mir nicht sicher, was GCC aus dem Kasten hat, aber es gibt Werkzeuge, die ich mit nebenbei so vertraut bin wie Valgrind und Electric Fence , die helfen könnten. Schließlich gibt es eine Tonne home-grown-Heap Debug-Bibliotheken das könnte hilfreich sein (Google um).

Könnten Sie bitte Ihre malloc () Erklärung zur Verfügung stellen?

Außerdem wollte ich überprüfen, verdoppeln, dass der Rückgabewert nicht null ist?

Außerhalb der nicht mit dem Speicher zu beginnen zuzuweisen, die Probleme, die ich erlebt habe, wenn malloc() mit oder new ähnlich der Natur Sie, wo tatsächlich Resultierende aus einer beschädigten Heap erwähnt. Ich fand in der Regel einig „interessanten“ Code an anderer Stelle im Programm soomething wie memcpy tun () mit einem Zeichenpuffer einen Puffer verursacht überrannt und einen verstümmelten Adressraum.

bn

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