2010-11-27 11 views
0

Ich habe c-Funktion in meinem Projekt, die eine Struktur erstellt und den Zeiger zurückgibt.c Speicherverlust Problem

typedef struct object 
{ 
float var1; 
float var2; 
} 
Object; 

Object *createObject(float newVar1, float newVar2) 
{ 
Object *object; //create new structure 
object = (Object*)malloc(sizeof(Object)); //malloc size for struct object 
if(object != NULL) //is memory is malloc'd 
{ 
    object->var1 = newVar1; //set the data for var1 
    object->var2 = newVar2; //set the data for var2 
    return object; //return the pointer to the struct 
} 
return NULL; //if malloc fails, return NULL 
} 

jetzt wird die Struktur verwendet, und nach einer Weile ich diese Struktur löschen möchten, habe ich diese Funktion:

void deleteMarnix(Object *objectPointer) 
{ 
free(objectPointer); //free the memory the pointer is pointing to 
objectPointer = NULL; //stop it from becomming a dangling pointer 
} 

dieser letzte Codeausschnitt zeigt, wie ich ein Objekt zu machen, verwenden Sie es und versuchen, um es zu löschen, scheint es jedoch, dass es den Speicher nicht vollständig freigibt. Was mache ich falsch?

Object *object = createObject(21.0f, 1.87f); 
//do things here with object. 
deleteMarnix(object); 
+0

Sie müssen zeigen, wie Sie wissen, dass es undicht ist, können Sie nur durch die CRT Vorbelegung sehen werden. – Puppy

+0

Was meinen Sie mit "es scheint, dass es die Erinnerung nicht vollständig freigibt"? –

Antwort

2

Was frei() gibt, ist nicht frei den Speicher, der vom Zeiger gehalten wird, sondern stellt ihn tatsächlich zur späteren Verwendung zur Verfügung, wenn wir nach dem Aufruf von free() ein malloc aufrufen.

Ein Beweis dafür ist, dass Sie nach dem Aufruf von free und vor dem Setzen des Zeigers auf NULL auf den Speicherort zugreifen können (vorausgesetzt, Sie haben malloc() noch nicht aufgerufen). Natürlich werden die Werte auf einige Standardwerte zurückgesetzt. (Bei einigen Compilern wurde festgestellt, dass int auf 0 gesetzt wurde).

Obwohl kein Speicherleck vorhanden ist, könnte dies Ihre Frage beantworten.

Lassen Sie uns wissen :)

+0

danke euch beiden, eure Beiträge waren sehr nützlich! –

3

Aus den Snippets, die Sie gepostet haben, gibt es kein Leck.

Ich denke, dass mit:

es scheint, dass es nicht völlig frei macht den Speicher

Sie bedeuten, dass object noch den alten Wert hält.


In deleteMarnix, wenn Sie objectPointer auf NULL, müssen Sie nur den Wert des Zeigers in diesem Funktionsumfang.

Es setzt nicht den Wert des tatsächlichen Zeigers object in der äußeren Funktion.

Um dies zu tun, können Sie entweder:

  1. Set es NULL in der äußeren Funktion

    Object *object = createObject(21.0f, 1.87f); 
    deleteMarnix(object); 
    object = NULL; 
    
  2. einen Zeiger auf einen Zeiger auf Ihre deleteMarnix Funktion übergeben:

    void deleteMarnix(Object **objectPointer) 
    { 
        free(*objectPointer); //free the memory the pointer is pointing to 
        *objectPointer = NULL; //stop it from becomming a dangling pointer 
    } 
    ... 
    Object *object = createObject(21.0f, 1.87f); 
    deleteMarnix(&object); 
    
+0

Es sollte immer noch frei() und nicht undicht werden. – Puppy

+0

Korrigieren. Es ist nur die Kopie des Zeigers in Ihrem letzten Bereich, die als "dangling pointer" bleibt, aber kein Speicherverlust auftritt. Ich empfehle auch, 'deleteMarnix' so zu deklarieren, dass ein' Objekt ** 'empfangen wird. – Kos

+0

Natürlich, aber es wird frei.Ich denke, dass, wenn "es scheint, dass es die Erinnerung nicht vollständig freigibt", OP bedeutet, dass "Objekt" immer noch den alten Wert hält. – peoro