Quando la tua libreria alloca memoria dal sistema operativo, il sistema operativo riserverà solo un intervallo di indirizzi nello spazio degli indirizzi virtuali del processo. Non c'è motivo per cui il sistema operativo fornisca effettivamente questa memoria fino a quando non la usi, come hai dimostrato.
Se guardi ad es. /proc/self/maps
vedrai l'intervallo di indirizzi. Se guardi la memoria di top usa non lo vedrai - non lo stai ancora usando.
Si prega di cercare l'overcommit. Linux per impostazione predefinita non riserva memoria fino a quando non vi si accede. E se finisci per aver bisogno di più memoria di quella disponibile, non ricevi un errore ma viene ucciso un processo casuale. Puoi controllare questo comportamento con /proc/sys/vm/*
.
IMO, l'overcommit dovrebbe essere un'impostazione per processo, non globale. E l'impostazione predefinita non dovrebbe essere overcommit.
Circa la seconda metà della tua domanda:
Lo standard del linguaggio non consente ritardi nel lancio di bad_alloc. Ciò deve avvenire in alternativa a new[] che restituisce un puntatore. Non può succedere più tardi!
Alcuni sistemi operativi potrebbero tentare di eseguire l'overcommit delle allocazioni di memoria e fallire in seguito. Questo non è conforme allo standard del linguaggio C++.