web-dev-qa-db-fra.com

int * array = new int [n]; que fait cette fonction?

Je suis confus sur la façon de créer un tableau défini dynamique:

 int *array = new int[n];

Je n'ai aucune idée de ce que cela fait. Je peux dire que cela crée un pointeur nommé tableau qui pointe vers un nouvel objet/tableau int? Quelqu'un voudrait-il expliquer?

16
pauliwago

new alloue une quantité de mémoire nécessaire pour stocker l'objet/le tableau demandé. Dans ce cas, n nombres d'int.

Le pointeur stockera ensuite l'adresse dans ce bloc de mémoire.

Mais attention, ce bloc de mémoire alloué ne sera pas libéré tant que vous ne le lui aurez pas dit en écrivant

delete [] array;
19
ANisus
int *array = new int[n];

Il déclare un pointeur sur un tableau dynamique de type int et de taille n

Une réponse un peu plus détaillée: new alloue une mémoire de taille égale à sizeof(int) * n octets et renvoie la mémoire stockée par la variable array. De plus, puisque la mémoire est allouée dynamiquement à l'aide de new, vous devez la désallouer manuellement en écrivant (lorsque vous n'en avez plus besoin, bien sûr):

delete []array;

Sinon, votre programme perdra de la mémoire d'au moins sizeof(int) * n octets (éventuellement davantage, en fonction de la stratégie d'allocation utilisée par la mise en œuvre).

9
Nawaz

La déclaration a essentiellement les effets suivants:

  1. Crée un tableau entier d'éléments 'n'
  2. Alloue la mémoire dans la mémoire HEAP du processus lorsque vous utilisez new operator pour créer le pointeur
  3. Retourne une adresse valide (si l'allocation de mémoire pour la taille requise est disponible au moment de l'exécution de cette instruction)
7
aeon

Il alloue sur le tas un espace égal à un tableau entier de taille N, .__ et lui renvoie un pointeur, qui est affecté au pointeur de type int * appelé "tableau".

1
DhruvPathak

Il alloue autant d’espace en fonction de la valeur de n et le pointeur pointe vers le tableau, c’est-à-dire le 1er élément du tableau

int *array = new int[n];
1
sgokhales

En C/C++, les pointeurs et les tableaux sont (presque) équivalents .int *a; a[0]; retournera *a et a[1]; renverra *(a + 1)

Mais array ne peut pas changer le pointeur vers lequel il pointe, alors que le pointeur le peut.

new int[n] allouera des espaces pour le "tableau"

0
LLS

A partir de C++ 11, le moyen sûr de le faire pour la mémoire (toujours avec une construction similaire) est d'utiliser std::unique_ptr :

std::unique_ptr<int[]> array(new int[n]);

Cela crée un pointeur intelligent sur un bloc de mémoire suffisamment grand pour les entiers n qui se supprime automatiquement quand il sort de la portée. Ce nettoyage automatique est important car il évite le cas où votre code se ferme tôt et n'atteint jamais votre instruction delete [] array;.

Une autre option (probablement préférable) consisterait à utiliser std::vector si vous avez besoin d’un tableau capable de redimensionnement dynamique. C'est bien quand vous avez besoin d'une quantité inconnue d'espace, mais cela a quelques inconvénients (temps non constant pour ajouter/supprimer un élément). Vous pouvez créer un tableau et y ajouter des éléments avec quelque chose comme:

std::vector<int> array;
array.Push_back(1);  // adds 1 to end of array
array.Push_back(2);  // adds 2 to end of array
// array now contains elements [1, 2]
0
Engineero