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.