web-dev-qa-db-fra.com

Que fait "new int (100)"?

Duplicata possible:
est-ce une variable ou une fonction

J'ai utilisé par erreur quelque chose comme:

int *arr = new int(100);

et il passe compiler, mais je savais que c'était faux. CA devrait etre

int *arr = new int[100];

Que pense le compilateur quand j'ai écrit le mauvais?

37
JASON

La première ligne alloue un seul int et l'initialise à 100. Considérez la int(100) comme un appel constructeur.

Comme il s'agit d'une allocation scalaire, essayer d'accéder à arr[1] Ou de libérer la mémoire à l'aide de delete[] Entraînerait un comportement indéfini.

62
NPE

Wikipedia nouveau (C++) citation:

int *p_scalar = new int(5); //allocates an integer, set to 5. (same syntax as constructors)
int *p_array = new int[5];  //allocates an array of 5 adjacent integers. (undefined values)

MISE À JOUR

Dans l'article Wikipedia actuel new et delete (C++) l'exemple est supprimé.

De plus, voici la référence C++ moins intuitive mais entièrement fiable pour new et new[] .

23
Peopleware

Il alloue un objet de type int et l'initialise à la valeur 100.

Beaucoup de gens ne savent pas que vous pouvez passer un initialiseur à new, il y a un idiome particulier qui devrait être plus largement connu afin d'éviter d'utiliser memset:

new int[100]();

Cela allouera un tableau de int et initialisera ses éléments à zéro.

De plus, vous ne devez pas utiliser une version tableau de new. Déjà. Il y a std::vector Dans ce but.

9
avakar

Le premier crée un seul nouvel entier, l'initialise à la valeur 100 et lui renvoie un pointeur.

En C/C++, il n'y a pas de différence entre un pointeur sur un tableau et un pointeur sur une seule valeur (un pointeur sur un tableau n'est en fait qu'un pointeur sur son premier élément). C'est donc une façon valide de créer un tableau avec un élément.

0
Philipp