269 votes

C++ new int[0] -- va-t-il allouer de la mémoire ?

Une simple application de test :

cout << new int[0] << endl;

sorties :

0x876c0b8

On dirait que ça marche. Que dit la norme à ce sujet ? Est-il toujours légal d'"allouer" un bloc de mémoire vide ?

4 votes

+1 Question très intéressante - même si je ne suis pas sûr qu'elle ait beaucoup d'importance dans le code réel.

43 votes

@Zifre : Je pose la question par curiosité, mais cela pourrait avoir de l'importance dans le monde réel, par exemple lorsque la taille des blocs de mémoire alloués est calculée d'une certaine manière, et que le résultat du calcul peut être zéro, alors il n'y a pas de besoin direct d'ajouter des exceptions pour ne pas allouer des blocs de taille zéro . En effet, ils devraient être alloués et supprimés sans erreur (si seulement le bloc de taille zéro n'est pas déréférencé). D'une manière générale, cela permet d'élargir l'abstraction de ce qu'est un bloc de mémoire.

2 votes

@emg-2 : Dans votre exemple, cela n'aurait pas d'importance, car delete[] est parfaitement légal sur un pointeur NULL :-).

2voto

Shi Jieming Points 531

Je vous garantis que new int[0] vous coûte de l'espace supplémentaire puisque je l'ai testé.

Par exemple, l'utilisation de la mémoire de

int **arr = new int*[1000000000];

est significativement plus petit que

int **arr = new int*[1000000000];
for(int i =0; i < 1000000000; i++) {
    arr[i]=new int[0];
}

L'utilisation de la mémoire du deuxième extrait de code moins celle du premier extrait de code correspond à la mémoire utilisée pour les nombreux nouveaux int[0].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X