0
votes

Utilisation de la spécification de la taille lors de l'allocation dynamique de la mémoire

J'essaie de comprendre quelle est l'utilisation exacte de la spécification de la taille lors de l'allocation dynamique de mémoire à l'aide d'un nouveau mot clé et quel rôle joue-t-il lorsque cette mémoire est libérée.

 char* c = new char; // Not specifying size here
 c[0] = 'h';
 c[1] = 'i';
 c[2] = '\0';
 delete c;        

 char* d = new char[3];
 d[0] = 'h';
 d[1] = 'i';
 d[2] = '\0';
 delete[] d;

Je sais que dans le premier exemple, j'accède à une mauvaise partie de la mémoire, et il est également évident qu'en appelant delete, cela ne libérerait pas toute la mémoire allouée, mais j'essaie de Comprenez que ce qui pourrait mal tourner dans ce scénario, lors de l'appel de delete.

Et d'après ce que je comprends, afin de garder une trace de la mémoire allouée et de la libérer correctement chaque fois que nécessaire, la spécification de la taille est requise. Veuillez fournir quelques informations sur cette partie.


1 commentaires

char * c = new char; alloue l'espace pour 1 caractère. Essayer d'accéder à plus que cela est un comportement indéfini.


3 Réponses :


2
votes

La spécification de la taille alloue un tableau. Si votre type est int [3] , il allouera de l'espace pour 3 int . Si le type est juste int , il n'allouera que suffisamment de mémoire pour 1 int .

Et d'après ce que je comprends, afin de garder une trace de la mémoire allouée et de la libérer correctement chaque fois que nécessaire, une spécification de taille est requise. Veuillez fournir quelques informations sur cette partie.

Vous devez garder une trace de la quantité de mémoire allouée pour ne pas sortir des limites. En ce qui concerne la libération de mémoire, delete et delete [] fonctionnent tout simplement. Ils gèrent la libération de la quantité correcte de mémoire sans enregistrement ni si vous la suivez dans le programme.


0 commentaires

3
votes

La première version du code alloue de l'espace pour un caractère, c'est parfaitement valable, vous pouvez allouer pour une seule chose avec new ou un tableau de choses avec new [] . Le problème, c'est que vous allez piétiner la mémoire que vous ne possédez pas , ce qui est un comportement indéfini.

Rien ne va pas lorsque vous appelez delete , vous supprimez un pointeur valide précédemment alloué. Ce qui peut mal se passer, c'est si vous faites muter une mémoire que vous ne possédez pas.

Dans le second cas, vous attribuez 3 caractères et les manipulations sont valides.

Notez qu'en C ++, vous devez utiliser soit std :: string pour les données de chaîne, soit std :: vector pour la longueur variable ou std :: array pour les allocations de longueur fixe.


0 commentaires

1
votes

"Qu'est-ce qui pourrait mal se passer dans ce scénario?"

Eh bien, c'est un comportement indéfini. Cela signifie que toutes les garanties ont disparu - pour de bon. Disque dur formaté? Tout pourrait mal tourner, donc ça aussi.

Utilisez simplement std :: string . Il enregistre les disques durs.


1 commentaires

Il existe des protections au niveau du système d'exploitation contre le formatage des disques durs, mais quant au fait de laisser la porte du réfrigérateur ouverte après avoir mangé tout le fromage? Pas de telles assurances.