C++ new int [0] - va-t-il allouer de la mémoire?
Une application de test simple:
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?
5 réponses
De 5.3.4 / 7
Lorsque la valeur de l'expression dans un direct-new-declarator est zéro, la fonction d'allocation est appelée pour allouer un tableau sans éléments.
De 3.7.3.1 / 2
L'effet du déréférencement d'un pointeur renvoyé en tant que demande de taille zéro n'est pas défini.
Aussi
Même si la taille de l'espace demandé [par new] est nulle, la requête peut échouer.
Cela signifie que vous pouvez le faire, mais vous pouvez pas légalement (d'une manière bien définie sur toutes les plates - formes) déréférencer la mémoire que vous obtenez - vous ne pouvez la transmettre à array delete-et vous devez la supprimer.
Voici une note de pied intéressante (c'est-à-dire pas une partie normative de la norme, mais incluse à des fins d'exposé) jointe à la phrase de 3.7.3.1 / 2
[32. L'intention est d'avoir operator new() implémentable en appelant malloc() ou calloc(), de sorte que les règles sont sensiblement les mêmes. C++ diffère de C dans exiger une requête zéro pour renvoyer un pointeur non null.]
Que dit la norme à ce sujet? Est-il toujours légal d '"allouer" un bloc de mémoire vide?
Chaque objet a une identité unique, c'est-à-dire une adresse unique, ce qui implique une longueur non nulle (la quantité réelle de mémoire sera silencieusement augmentée, si vous demandez zéro octet).
Si vous avez alloué plus d'un de ces objets, vous constaterez qu'ils ont des adresses différentes.
Oui, il est tout à fait légal d'allouer un bloc de taille 0
avec new
. Vous ne pouvez tout simplement rien faire d'utile avec elle car il n'y a pas de données valides pour vous d'accéder. int[0] = 5;
est illégal.
Cependant, je crois que la norme permet à des choses comme malloc(0)
de retourner NULL
.
Vous aurez toujours besoin de delete []
Quel que soit le pointeur que vous récupérez de l'allocation.
Curieusement, C++ nécessite que l'opérateur new renvoie un pointeur légitime même lorsque zéro octet est demandé. (Nécessitant de cette étrange consonance le comportement simplifie les choses ailleurs dans la langue.)
J'ai trouvé efficace c++ troisième édition dit comme ceci dans "Article 51: adhérer à la convention lors de l'écriture de nouveaux et supprimer".