10
votes

Mémoire de réaffectation via "Nouveau" en C ++

Question rapide concernant la gestion de la mémoire en C ++

si je fais l'opération suivante: xxx

puis effectuez-la à nouveau, peut-être un résultat différent étant renvoyé de < Code> Strlen (quelqueinput_input) .

Est-ce que cela résulte de la mémoire à gauche allouée à partir de la déclaration précédente " nouvelle "? Comme dans, est chaque Nouvelle instruction recevant un autre bloc de mémoire de tas du système d'exploitation ou réaffectant-t-il simplement?

supposant que je fais une finale Supprimer le pointeur []; qui annouez-vous toute la mémoire que j'ai jamais allouée via nouveau à ce pointeur?


1 commentaires

La mémoire de recyclage est jusqu'à la plate-forme / du système d'exploitation et peut être différente entre différentes plates-formes. Une fois que la mémoire est Supprimer d ou libres D, la plate-forme est en charge de celui-ci et quand la réutiliser, si possible.


8 Réponses :


7
votes

Lorsque vous dites "ce pointeur", il est important de comprendre que la valeur de "ce pointeur" va changer avec chaque allocation. Après une allocation, peut-être qu'il est 0x100234 et après la prochaine allocation, il est 0x104234. Cela signifie que si vous réaffectez un pointeur à une nouvelle adresse (un nouveau bloc de mémoire) sans libérer (supprimer [] ing) l'ancien bloc, vous allez étancher une mémoire pendant la durée du processus.


0 commentaires

10
votes

Chaque appel à Nouveau doit correspondre à un appel correspondant à Supprimer . .

En tant que mis à part, vous devriez probablement envisager d'utiliser std :: string < / Code> ou même std :: vecteur < / Code> (en fonction de la situation exacte), plutôt que d'essayer d'allouer des tableaux de caractères vous-même. Ensuite, vous n'avez jamais besoin de vous inquiéter.


3 commentaires

Et chaque appel à la nouvelle [] doit être jumelé avec Suppr []


Et si vous voulez vraiment le pointeur, utilisez STD :: TR1 :: Shared_ptr pour obtenir la manipulation de la mémoire de libération.


@jpyllman: Mais Afaik Shared_PTR <> ne peut pas gérer les tableaux de la boîte. Vous devriez fournir un raccord de Delier



2
votes

Cela laissera votre mémoire pendante. Vous devrez appeler la commande Suppr [] avant d'utiliser à nouveau l'opérateur «Nouveau» sur le même pointeur (sauf si vous avez attribué cette adresse à un autre pointeur).


0 commentaires

2
votes

Un pointeur est simplement une variable qui contient une adresse mémoire. Il ne fait pas de comptage de référence implicite.

Chaque nouvelle instruction [] renvoie l'adresse du premier élément du tampon. Où vous stockez cette adresse ou même si vous stockez du tout, cela n'a pas d'importance.

La mémoire ne sera distribuée que lorsque vous appelez Suppr [].

en C ++, il n'y a pas de comptage automatique de référence / suppression automatique. Lorsque vous faites une autre allocation, cela ne libère pas l'ancien.


0 commentaires

3
votes

En bref, chaque fois que vous appelez nouveau, vous allociez une nouvelle mémoire hors du tas. Il n'y a pas de magie en C ++ qui se souviendra de ce que vous avez attribué le pointeur.


0 commentaires

2
votes

Chaque Nouveau est une autre allocation. Si vous réaffectez le résultat à la même variable de pointeur sans Supprimer au milieu, la mémoire est perdue, c'est-à-dire que vous avez eu une fuite de mémoire . < / p>


0 commentaires

9
votes

Cela résulte-t-il en mémoire étant laissé alloué à partir de la précédente déclaration "nouvelle" "?

Oui, cela s'appelle une fuite de mémoire.

C'est-à-dire que chaque nouvel instruction reçoit un autre bloc de mémoire de tas du système d'exploitation ou est-ce simplement réaffectant?

C'est un nouveau bloc de mémoire du tas.

en supposant que je fais un dernier pointeur de suppression []; Est-ce que cela annouez-vous et tout la mémoire que j'ai jamais allouée via un nouveau pointeur?

Si vous "Supprimer [] Pointeur;", il distribuera la mémoire qu'elle pointe. Seulement la mémoire du dernier "nouvel appel []" appel.


0 commentaires

1
votes

Comme indiqué précédemment, la nouvelle AHS doit être assortie à une suppression. Mais si vous pouvez utiliser MALLOC / GRATUIT STDLIB, il existe une fonction réelococ: Cplusplus.com


0 commentaires