2017-10-14 13 views
-5

J'ai deux pointeurs:La redirection d'un pointeur entraîne-t-elle une fuite de mémoire?

int *a = new int; 
int *b = new int; 

Maintenant, je b ensemble égal à a:

b=a; 

Ma préoccupation concerne la mémoire qui b pointait initialement à. Lorsque je redirige b pour pointer vers la mémoire que a pointe vers et tous deux pointent vers le même emplacement de mémoire. Qu'en est-il de l'emplacement mémoire précédent de b, est-il libéré ou est-il en fuite de mémoire?

Pour éviter la fuite de mémoire dois-je faire de cette façon:

delete b; 
b=a; 
+1

Bien sûr, ce code fuit la mémoire comme un tamis. – user0042

+1

Il n'y a pas de garbage collection en C++, donc sans le 'delete' c'est une fuite de mémoire. (Aussi en C++ moderne, vous devriez préférer les pointeurs intelligents aux pointeurs bruts pour cette raison) – UnholySheep

+1

Si vous pensez avoir besoin de pointeurs, vous en aurez rarement besoin pour des valeurs simples de types simples comme 'int'. Considérons ensuite les conteneurs standards ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) et [' std :: vector'] (http: //en.cppreference. com/w/cpp/conteneur/vecteur). Considérez ensuite les pointeurs intelligents comme ['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr) et [' std :: shared_ptr'] (http: //en.cppreference. com/w/cpp/mémoire/shared_ptr). Ensuite et seulement ensuite, considérez les pointeurs simples. –

Répondre

1

C'est une fuite de mémoire. Vous n'avez pas delete ce que vous new -ed comme b ne pointe plus à l'emplacement d'origine. Essayez ceci:

int* a = new int; 
int* b = new int; 
int* originalb = b; 
b = a; 
delete originalb; 
delete b; // or a 

étant donné que a et b restent les mêmes. Ceci étant dit, préférez smart pointers, containers et RAII aux pointeurs bruts.

2

Il est une fuite.

Vous devez utiliser des pointeurs intelligents à la place.