2017-10-14 4 views
-5

Ich habe zwei Zeiger:Führt das Umleiten eines Zeigers zu einem Speicherleck?

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

Jetzt stelle ich b gleich a:

b=a; 

Meine Sorge um die Erinnerung ist, dass b zunächst auf hinwies. Wenn ich b umleiten, um auf den Speicher zu zeigen, der auf a zeigt, zeigen beide auf denselben Speicherort. Was ist mit dem vorherigen Speicherort von b, ist es freigegeben oder es ist im Speicherleck?

Speicherverlust zu verhindern, sollte ich es tun auf diese Weise:

delete b; 
b=a; 
+1

Natürlich verliert dieser Code Speicher wie ein Sieb. – user0042

+1

Es gibt keine Speicherbereinigung in C++, also ohne das 'delete' ist es ein Speicherleck. (Auch im modernen C++ sollten Sie aus diesem Grund lieber Smartpointer als rohe Pointer verwenden.) – UnholySheep

+1

Wenn Sie denken, dass Sie Zeiger benötigen, wird der erste von Ihnen nur selten für einzelne Werte einfacher Typen wie 'int' benötigt. Betrachten Sie dann die Standardcontainer ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) und [' std :: vector'] (http: //en.cppreference. com/w/cpp/Behälter/Vektor). Betrachten Sie dann Smartpointer wie ['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr) und [' std :: shared_ptr'] (http: //en.cppreference. com/w/cpp/speicher/shared_ptr). Dann und nur dann betrachten Sie rohe einfache Zeiger. –

Antwort

1

Es ist ein Speicherleck. Sie haben nicht delete was Sie new -ed als b nicht mehr auf den ursprünglichen Speicherort verweist. Versuchen Sie folgendes:

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

gegeben, dass a und b gleich bleiben.
Das sagte lieber smart pointers, containers und RAII zu rohen Zeigern.

2

Es ist ein Leck.

Sie sollten stattdessen intelligente Zeiger verwenden.

Verwandte Themen