2010-11-27 15 views
0

私は構造体を作成してポインタを返す私のプロジェクトでcの関数を持っています。cメモリリークの問題

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 
} 

今構造体が使用されますと、私は、この構造を削除するしばらく後、私はこの機能を作った:

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); 
//do things here with object. 
deleteMarnix(object); 
+0

あなたは、あなただけのCRTによって事前割り当てを見ることができ、あなたはそれが漏れています知っている方法を示す必要があります。 – Puppy

+0

"それは完全にメモリを解放していないようです"とはどういう意味ですか? –

答えて

2

free()は、ポインタが保持するメモリを完全に解放しませんが、free()を呼び出した後にmallocを呼び出すと、後で使用できるようになります。

freeを呼び出した後、ポインタをNULLに設定する前にメモリ位置にアクセスできるという証拠があります(まだmalloc()を呼び出していないことを前提とします)。もちろん、値はいくつかのデフォルト値にリセットされます。 (一部のコンパイラでは、intが0に設定されていました)。

メモリリークはありませんが、これはあなたの質問に答えるかもしれません。

私たちを知ってみましょう:)

+0

ありがとう、あなたの記事はとても役に立ちました! –

3

投稿したスニペットから、リークはありません。私はと思い

メモリ

それは完全に解放しないと思われますがobjectはまだ古い値を保持していることを意味します。 deleteMarnix


、あなたがobjectPointerNULLに設定した場合、あなただけのその関数のスコープ内のポインタの値を設定します。

実際のポインタobjectの値を外部関数に設定しません。あなたはどちらかのことを行うには

  1. は、外側の関数でNULL

    Object *object = createObject(21.0f, 1.87f); 
    deleteMarnix(object); 
    object = NULL; 
    
  2. それを設定するには、あなたのdeleteMarnix関数へのポインタへのポインタを渡します

    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

まだ解放されていて、漏れてはいけません。 – Puppy

+0

正しい。最後のスコープ内のポインタのコピーだけが "ダングリングポインタ"のままですが、メモリリークは発生しません。 'deleteMarnix'を' Object ** 'を受け取ると宣言することもお勧めします。 – Kos

+0

もちろん、それは自由になっています。「記憶が完全に解放されていないように見える」とは、OPは「オブジェクト」が古い値を保持しているという意味です。 – peoro

関連する問題