Question rapide concernant la gestion de la mémoire en C ++
si je fais l'opération suivante: p> puis effectuez-la à nouveau, peut-être un résultat différent étant renvoyé de < Code> Strlen (quelqueinput_input) Code>. P> Est-ce que cela résulte de la mémoire à gauche allouée à partir de la déclaration précédente " supposant que je fais une finale nouvelle code>"? Comme dans, est chaque
Nouvelle instruction code> recevant un autre bloc de mémoire de tas du système d'exploitation ou réaffectant-t-il simplement? P>
Supprimer le pointeur []; code> qui annouez-vous toute la mémoire que j'ai jamais allouée via
nouveau code> à ce pointeur? p> p>
8 Réponses :
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. P>
Chaque appel à En tant que mis à part, vous devriez probablement envisager d'utiliser Nouveau code> doit correspondre à un appel correspondant à
Supprimer code>. P>.
std :: string < / Code>
ou même std :: vecteur
(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. P>
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 <> code> ne peut pas gérer les tableaux de la boîte. Vous devriez fournir un raccord de Delier
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). P>
Un pointeur est simplement une variable qui contient une adresse mémoire. Il ne fait pas de comptage de référence implicite. Strong> p>
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. p>
La mémoire ne sera distribuée que lorsque vous appelez Suppr []. P>
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. p>
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. p>
Chaque Nouveau code> est une autre allocation. Si vous réaffectez le résultat à la même variable de pointeur sans
Supprimer code> au milieu, la mémoire est perdue, c'est-à-dire que vous avez eu une fuite de mémoire
Cela résulte-t-il en mémoire étant laissé alloué à partir de la précédente déclaration "nouvelle" "? p> blockQuote>
Oui, cela s'appelle une fuite de mémoire. P>
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? P> blockQuote>
C'est un nouveau bloc de mémoire du tas. P>
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? P> blockQuote>
Si vous "Supprimer [] Pointeur;", il distribuera la mémoire qu'elle pointe. Seulement la mémoire du dernier "nouvel appel []" appel. P>
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 P>
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 code> d ou
libres code> D, la plate-forme est en charge de celui-ci et quand la réutiliser, si possible.