Warum ist malloc (0) in "Innerhalb des C ++ Objektmodells" nützlich?

8

In Abschnitt 6.3 des Buchs "Innerhalb des C ++ Objektmodells", Temporäre Objekte (Seite 230):

  

Die tatsächlichen Ergebnisse sind abhängig von der Implementierung abhängig   aggressiv ist der zugrundeliegende delete - Operator in der Tat frei   Speicher adressiert. Einige Implementierungen, während der Speicher als markiert wird   frei, ändern Sie es nicht wirklich in irgendeiner Weise. Bis die Erinnerung beansprucht wird   durch etwas anderes kann es verwendet werden, als wäre es nicht gelöscht worden. While   offensichtlich kein vorbildlicher Ansatz für das Software-Engineering   Es ist nicht ungewöhnlich, auf den Speicher zuzugreifen, nachdem er freigegeben wurde.    Viele Implementierungen von malloc() bieten tatsächlich eine Besonderheit   Aufruf malloc(0); , um genau dieses Verhalten zu garantieren.

Demnach scheint malloc(0) mit dem Zugriff auf Speicher zusammenzuhängen, der bereits freigegeben wurde (dessen Inhalt jedoch nicht geändert wurde).

Meine Frage ist, wie malloc(0) dieses Verhalten garantieren kann?

    
user571470 25.12.2012, 03:30
quelle

3 Antworten

1

Aus dem Zitat scheint es, dass es Implementierungen von malloc() gibt, die malloc(0) als irgendeine Art von Schalter verwenden, um anzuzeigen, dass zukünftige Aufrufe von malloc() Speicher in einer Weise zuweisen, dass free() (und wahrscheinlich realloc(p, 0) ) ändert den Inhalt des belegten Speichers nicht, wenn er als unbenutzt markiert wird. Dies ist eindeutig eine standardkonforme Erweiterung, auf die Sie sich besser nicht verlassen sollten.

    
Dietmar Kühl 25.12.2012, 03:50
quelle
2

BEARBEITEN : Ich habe nicht bemerkt, dass "innerhalb des C ++ Objektmodells" eine Referenz und nicht nur ein Teil des Fragetitels war.

Wie Dietmar Kuhl sagt, sieht es wie ein Kludscher aus und Sie sollten sich nicht auf eine solche Erweiterung verlassen, selbst wenn es auf Ihrer Plattform erscheint.

"Die meisten Plattformen" do enthalten eine Art von malloc Debugging-Funktion, um Programmierern zu helfen, Code zu finden, der auf Speicher zugreift, der bereits an free übergeben wurde. Dies kann eine weniger mühsame Speicherverwaltung oder ein Überschreiben mit einem speziellen Byte-Muster beinhalten. Es klingt so, als ob der Text malloc(0) als Mittel zur Deaktivierung einer solchen Einrichtung beschreibt. Unter Mac OS X erinnere ich mich, dass es eine Umgebungsvariable gibt (etwas wie MALLOC_DEBUG ), die dies steuert. Was die Einrichtung tut und wie sie aktiviert wird, variiert viel zwischen den Plattformen. Overriding malloc(0) ist weder üblich noch eine gute Schnittstelle.

BEARBEITEN : Ich habe es in Potatoswatter 25.12.2012 06:24

quelle
0

Vom praktischen Standpunkt aus kann malloc nicht einmal Platz für die tatsächliche Zuweisung reservieren.

Der effektivste Weg, um zu sehen, wie malloc funktioniert, ist, es als eine Anfrage für den Kernel zu betrachten, der Kernel kann "ok" oder "nein" sagen, aber wenn der Kernel "ok" sagt, kann man einfach ' t sicher sein, wenn es wirklich Speicher für Sie reserviert oder es einfach nur sagt "ok", um Sie glücklich zu machen.

Es ist eine Art Überbuchung über die Speicherseiten, es ist ein übliches Problem unter Linux, normalerweise ist der Linux Kernel sehr permissiv auf malloc Anfragen, aber es kann passieren, dass dir nicht genügend Speicher zur Verfügung steht, auch wenn du malloc Anfrage liefert ein positives Ergebnis.

Wenn Sie einen Namen für eine Themensuche nach "Linux memory overcommit" haben wollen, erhalten Sie eine allgemeine Vorstellung davon, wie malloc unter Linux funktioniert, ähnliche Konzepte gelten auch für andere Plattformen, was bedeutet, dass Sie niemals eine Konsistenz und Kreuzung erhalten -Plattform kompatibles Verhalten von malloc und alles hängt grundsätzlich vom Kernel ab.

    
user1824407 25.12.2012 03:40
quelle

Tags und Links