Když vaše knihovna alokuje paměť z OS, OS si pouze vyhradí rozsah adres ve virtuálním adresním prostoru procesu. Není důvod, aby OS skutečně poskytoval tuto paměť, dokud ji nepoužijete – jak jste ukázali.
Pokud se podíváte např. /proc/self/maps
zobrazí se rozsah adres. Pokud se podíváte na použití paměti top neuvidíte jej – zatím jej nepoužíváte.
Hledejte prosím přetížení. Linux ve výchozím nastavení nerezervuje paměť, dokud k ní není přístup. A pokud nakonec budete potřebovat více paměti, než je k dispozici, neobjeví se chyba, ale náhodný proces bude zabit. Toto chování můžete ovládat pomocí /proc/sys/vm/*
.
IMO, overcommit by mělo být nastavení pro jednotlivé procesy, nikoli globální. A výchozí hodnota by neměla být překročení.
O druhé polovině vaší otázky:
Jazykový standard neumožňuje žádné zpoždění při vyvolání bad_alloc. To se musí stát jako alternativa k new[] vracení ukazatele. Později se to stát nemůže!
Některé operační systémy se mohou pokusit přerušit přidělení paměti a později selžou. To není v souladu s jazykovým standardem C++.