GNU/Linux >> LINUX-Kenntnisse >  >> Linux

new[] verringert den verfügbaren Speicher nicht, bis er gefüllt ist

Wenn Ihre Bibliothek Speicher vom Betriebssystem zuweist, reserviert das Betriebssystem einfach einen Adressbereich im virtuellen Adressraum des Prozesses. Es gibt keinen Grund für das Betriebssystem, diesen Speicher tatsächlich bereitzustellen, bis Sie ihn verwenden - wie Sie demonstriert haben.

Schaut man sich z.B. /proc/self/maps Sie sehen den Adressbereich. Wenn Sie sich den Speicher von top ansehen use Sie werden es nicht sehen - Sie verwenden es noch nicht.


Bitte suchen Sie nach Overcommit. Linux reserviert standardmäßig keinen Speicher, bis darauf zugegriffen wird. Und wenn Sie am Ende mehr Speicher benötigen als verfügbar ist, erhalten Sie keinen Fehler, sondern ein zufälliger Prozess wird beendet. Sie können dieses Verhalten mit /proc/sys/vm/* steuern .

IMO, Overcommit sollte eine Einstellung pro Prozess sein, keine globale. Und der Standardwert sollte kein Overcommit sein.


Über die zweite Hälfte Ihrer Frage:

Der Sprachstandard erlaubt keine Verzögerungen beim Werfen eines bad_alloc. Das muss als Alternative zu new[] passieren, das einen Zeiger zurückgibt. Das kann später nicht passieren!

Einige Betriebssysteme versuchen möglicherweise, Speicherzuweisungen zu überschreiben, und schlagen später fehl. Das entspricht nicht dem C++-Sprachstandard.


Linux
  1. Linux – Wie erhält man die Menge an verfügbarem Speicher portabel über Distributionen hinweg?

  2. Grep:Speicher erschöpft?

  3. SQL Server Standard verwendet den gesamten verfügbaren Arbeitsspeicher

  4. PHP-Speicherlimit

  5. Jenkins aktiv (beendet)

Bash bis Loop

Was ist NVM (nicht flüchtiger Speicher)?

5 Möglichkeiten zum Überprüfen des verfügbaren Speichers in Ubuntu 22.04

Fedora 30-Hintergründe zum Herunterladen verfügbar

Top 10 Linux-Distributionen

Speicherauslastung des TOP-Befehls