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?

206
demandé sur SCFrench 2009-07-06 17:42:29

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.]

209
répondu Faisal Vali 2012-08-31 19:17:50

Oui, il est légal d'allouer un tableau de taille zéro comme celui-ci. Mais vous devez également supprimer.

20
répondu 2009-07-06 13:45:23

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.

15
répondu ChrisW 2009-07-06 13:49:34

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.

13
répondu Evan Teran 2016-11-14 16:31:26

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".

1
répondu shuaihanhungry 2016-05-27 11:51:03