La réaffectation de la mémoire via la “nouvelle” en C++
Petite question concernant la gestion de la mémoire en C++
Si je fais l'opération suivante:
pointer = new char [strlen(someinput_input)+1];
Puis l'exécuter à nouveau, avec peut-être un autre résultat retourné par strlen(someinput_input)
.
Est-ce le fruit en mémoire à gauche allouée à partir de la précédente "new
" déclaration? Comme dans chaque new
déclaration de la réception d'un autre bloc de mémoire dans la mémoire de l'OS, ou est-ce simplement la réaffectation?
En supposant que je fais une dernière delete pointer[];
sera que de libérer toute et toute la mémoire que j'ai jamais affectés par new
de pointeur?
Le recyclage de la mémoire est de la plate-forme / OS, et il peut être différent entre les différentes plates-formes. Une fois que la mémoire est
delete
d ou free
d, la plate-forme qui en est chargé, et quand l'utiliser, si possible.OriginalL'auteur BSchlinker | 2010-04-01
Vous devez vous connecter pour publier un commentaire.
Chaque appel à
new
doit être mis en correspondance avec un appel correspondant àdelete
.En aparté, vous devriez probablement envisager d'utiliser
std::string
ou mêmestd::vector<char>
(en fonction de la situation exacte), plutôt que d'essayer d'allouer des tableaux de char vous-même. Alors vous n'avez pas toujours besoin de s'inquiéter.Et si vous voulez vraiment le pointeur, utilisation de std::tr1::share_ptr pour obtenir le traitement de libérer de la mémoire.
Mais autant que je sache
shared_ptr<>
ne peut pas traiter avec les tableaux de la boîte. Vous devez fournir un raccord deleterOriginalL'auteur Dean Harding
Quand vous dites "pointeur", il est important de comprendre que la valeur de "pointeur" est en passe de changer avec chaque allocation. Après une affectation, c'est peut-être 0x100234, et après la prochaine affectation, c'est 0x104234. Ce que cela signifie est que si vous réaffectez un pointeur vers une nouvelle adresse (un nouveau bloc de mémoire) sans libérer de l' (delete[]ing) l'ancien bloc, vous aurez une fuite de mémoire pour la durée de la procédure.
OriginalL'auteur warrenm
Oui, cela s'appelle une fuite de mémoire.
C'est un nouveau bloc de mémoire dans le tas.
Si vous "delete [] pointeur;", il va libérer la mémoire qu'il indique. Seulement la mémoire de la dernière "new char[]" appel.
OriginalL'auteur Stephen
Il laissera votre mémoire ballants. Vous aurez besoin d'appeler le delete [] commande avant d'utiliser l'opérateur 'new' de nouveau sur le même pointeur (à moins que vous avez attribué à cette adresse à un autre pointeur).
OriginalL'auteur Jordan Parmer
Un pointeur est simplement une variable qui contient une adresse mémoire. Il ne fait pas référence implicite à compter.
Chaque nouvelle[] instruction retourne l'adresse du premier élément dans la mémoire tampon.
Où vous stockez cette adresse, ou même si vous les conservez à tous n'a pas d'importance.
La mémoire ne seront libéré lorsque vous appeler delete[].
En C++ n'est pas automatique de comptage de référence/de suppression automatique. Lorsque vous faites une autre allocation, il n'est pas libre à l'ancien.
OriginalL'auteur Brian R. Bondy
En court Pas. Chaque fois que vous appelez nouveau vous allouez de la mémoire hors du tas. Il n'y a pas de magie dans le c++ qui se souvient de ce que vous avez assigné le pointeur de trop.
OriginalL'auteur goldsz
Chaque
new
est une autre allocation. Si vous réaffectez le résultat pour le même pointeur de variable sansdelete
dans le milieu puis la mémoire est perdue, c'est à dire vous l'avez vous-même un fuite de mémoire.OriginalL'auteur Nikolai Fetissov
Comme dit précédemment, le nouveau papa à être mis en correspondance avec un delete. MAIS si vous pouvez utiliser stdlib malloc/free, il y a une fonction realloc:
cplusplus.com
OriginalL'auteur user1228651