2017-04-15 2 views
0

Ich habe den folgenden Code, und ich werde gefragt, ob es hier ein Speicherleck gibt. Ich glaube, es gibt ein Speicherleck innerhalb von "function", weil es nach a = new A() keinen Löschvorgang gibt; . Habe ich recht?Memory Leak Spotting

class A 
{ 
public: 
    A(){}; 
    ~A(){}; 
private: 
    double d[10]; 
}; 

void function (A* a) 
{ 
    delete a; 
    a = new A(); 
} 

void main (void) 
{ 
    A* p = new A(); 
    function(p); 
    delete p; 
} 
+0

Ja, Sie haben Recht. –

+1

Es ist schlimmer als nur ein Speicherleck zu haben ... du löschst auch die erste Zuweisung von A ... einmal in der Funktion (A * a) und einmal in main(). – aSteve

+0

Und es gibt auch eine doppelte Löschung, weil 'p' zweimal gelöscht wird, einmal in' function' und einmal in 'main'. –

Antwort

1

sollte Dieses Programm und verlieren Speicher zum Absturz bringen.

Crash, da der Hauptfreigabespeicher bereits in function freigegeben wurde.

Speicher verlieren, weil a zugeordnet in function nicht zurückgegeben wird, und ist intern zu function.

0

Grundsätzlich denke ich, es gibt ein Missverständnis was passiert.

Sie haben recht, dass es ein Pass-by-Pointer ist. Das bedeutet, dass die Adresse auf den Stack der Callee-Funktion geschoben wird (oder in ein Register gestellt wird, abhängig von der Aufrufkonvention). Und diese Adresse auf dem Stapel (oder in dem Register) wird zum Freigeben des Objekts verwendet. Und schließlich wird diese Adresse mit der vom neuen Betreiber zurückgegebenen Adresse überschrieben.

Also p hat sich nicht geändert, da es im Stapel des Anrufers nicht in der Angerufenen ist.

+0

Danke für die Erklärung. Wie kann ich diesen Code reparieren? Sollte ich Smart Pointer oder Referenzen verwenden, um Speicherlecks zu vermeiden? – Billyx24