Lorsque votre bibliothèque alloue de la mémoire à partir du système d'exploitation, le système d'exploitation réserve simplement une plage d'adresses dans l'espace d'adressage virtuel du processus. Il n'y a aucune raison pour que le système d'exploitation fournisse réellement cette mémoire jusqu'à ce que vous l'utilisiez - comme vous l'avez démontré.
Si vous regardez par ex. /proc/self/maps
vous verrez la plage d'adresses. Si vous regardez la mémoire de top, utilisez vous ne le verrez pas - vous ne l'utilisez pas encore.
S'il vous plaît rechercher overcommit. Linux par défaut ne réserve pas de mémoire jusqu'à ce qu'on y accède. Et si vous finissez par avoir besoin de plus de mémoire que disponible, vous n'obtenez pas d'erreur mais un processus aléatoire est tué. Vous pouvez contrôler ce comportement avec /proc/sys/vm/*
.
IMO, overcommit devrait être un paramètre par processus, pas global. Et la valeur par défaut ne devrait pas être overcommit.
À propos de la seconde moitié de votre question :
La norme de langage n'autorise aucun retard dans le lancement d'un bad_alloc. Cela doit se produire comme alternative à new[] renvoyant un pointeur. Cela ne peut pas arriver plus tard !
Certains systèmes d'exploitation peuvent essayer de surcharger les allocations de mémoire et échouer plus tard. Cela n'est pas conforme au standard du langage C++.