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?
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.
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)
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[]
.
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.
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.