Je viens de faire un test tout simple afin de vérifier/modifier certaines habitudes de codage, du genre:
Sous Windows et Visual Studio 2015, machine avec 8GB de mémoire physique, j'ai alloué quelques terrabytes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 try { voidptr = ::operator new(stupid_big_value); if (voidptr) ...; } catch (std::bad_alloc &) { ... }... Et aucune exception n'est levée
Code : Sélectionner tout - Visualiser dans une fenêtre à part stupid_big_value = 8ull * 1024 * 1024 * 1024 * 65536;
Certains diront que c'est normal, la mémoire (virtuelle) est réservée mais non commitée.
Je n'ose pas faire un memset(voidptr, 0, stupid_big_value), mais ce serait amusant de voir quand le système se fige...
En bref, à quoi bon perdre son temps à essayer de récupérer un std::bad_alloc ou vérifier la nullité d'un pointeur après allocation, si, à priori, la mémoire est toujours "allouée".
Partager