2011-01-05 22 views
1

wird das folgende Code Ergebnis in einem SpeicherleckSpeicherleck in c

char * a() 
{ 
    char * b = malloc(100); 
    return b; 
} 

B() 
{ 
    char * c = a(); 
    free (c); 
} 
+13

Bitte lesen Sie ein Buch. – frast

+0

Dies ist nicht gültig C++. – GManNickG

+1

@GMan: Sie sollten darauf hingewiesen haben, dass die zweite Funktion mit einem Rückgabetyp deklariert werden muss, d. H. 'Void B()'. "Das ist kein gültiges C++" hilft dem OP möglicherweise überhaupt nicht. ;) – Mephane

Antwort

10

Nein, Sie sind nach all den zugewiesenen Speicher zu befreien. Die allgemeine Regel ist, wenn Sie free() für jeden malloc() Funktionsaufruf anrufen, dann bedeutet das Sie nicht Speicher undicht.

3

Nr

Sie Speicher Zuweisung innerhalb a(), einen Zeiger auf diesen Speicher zurückkehrt, die Sie in B sind zu befreien().

0

Nein, Sie den Speicher zuzuweisen, und an derselben Adresse den Speicher frei (auch wenn der Zeiger, enthält die Adresse um kopiert wurde).

0

Ich glaube nicht ... Warum denken Sie es in einem Leck führen könnte? Der Speicher, den Sie zuweisen, ist derselbe, den Sie frei haben.

0

Es wird nicht ein Speicherleck. Ihre Funktion a() gibt die Adresse des Speicherplatzes an die Funktion b() zurück, die freigegeben wird. Verwechseln Sie nicht die Zuweisung und Aufhebung von Speicher in verschiedenen Funktionen. Es funktioniert gut, da Speicher, den Sie zuweisen, auf Heap ist, der für beide Funktionen e.i. a() & b() (soweit sie im gleichen Adressraum sind).

2

In der Funktion B(), wird es auf jeden Fall nicht zu einem Speicherverlust führen, da Sie kostenlos anrufen. Aber es wird einen Speicherverlust verursachen, wenn Sie ein() aufrufen, ohne frei zu rufen. Falls Sie Speicherlecks bekommen und sich fragen, warum es passiert, suchen Sie dann woanders, wo Sie die Funktion a() aufrufen, ohne frei zu rufen () danach.