2016-04-12 16 views
-4

Die folgenden article erklärt Speicherlecks. Ich frage mich, warum der folgende Code ein Speicherleck verursacht.Warum ist das ein Speicherleck?

int *data = new int; 
    *data = 15; 

Wenn ich data erstellen und 15 zuweisen, dann so viel wie ich 15 verstehen in den Speicher kopiert wird data So haben wir noch einen Zeiger, der auf data Punkte und wir können delete es.

Ich denke, ein Speicherleck wäre data = 0x00123 zum Beispiel, oder? Hier haben wir bereits die Kontrolle über die Erinnerung verloren, und die Erinnerung ist wirklich verschwendet.

Irgendwelche Gedanken?

+2

Das Leck ist, wenn "löschen" nie auf den Zeiger aufgerufen wird, auf den "Daten" zeigen, das Kopieren von "15" ist kein Problem. –

+2

Sie wissen, der Artikel sagt Ihnen genau, warum es ein Leck direkt unter dem Code. Auch der Code, wie er ist, ist kein Speicherleck, da wir keinen Kontext haben, wo er ist. – NathanOliver

Antwort

7

Sie lesen selektiv.

Zitat von der ursprünglichen Website Sie verknüpft:

Out of Scope Pointer

void memLeak() 
{ 
    int *data = new int; 
    *data = 15; 
} 

in diesem Beispiel gibt es einen Speicherverlust, da niemand data gelöscht und es wird nicht-erreichbar nach memLeak

dieses snippet:

int *data = new int; 
*data = 15; 

ist nicht ein Speicherverlust von selbst

3

Sie haben den vollständigen Kontext dieses Codes zu berücksichtigen:

void memLeak() 
{ 
    int *data = new int; 
    *data = 15; 
} 

In diesem Zusammenhang, sobald die Funktion zurück, die Sie nicht mehr Zugriff auf den Zeiger haben, so dass es nicht möglich ist, den diesem Zeiger zugeordneten Speicher wiederherzustellen.

-1

Auf einer separaten Notiz, data = 0x00123 ist viel schlimmer als Speicherleck. Es ist undefined Verhalten.

+0

Warum, wenn ich nicht auf diesen Speicher zugreife? – Narek

+0

Das ist falsch. Sie können alles, was Sie möchten, einer Stapelvariablen zuweisen. – Aenimated1

+0

@ Narek, weil das ein ungültiger Zeiger wird. Und der Standard ist ziemlich streng in Bezug auf ungültige Zeiger. – SergeyA