2016-04-13 17 views
0

次のように私はC言語で構造体を持って次のようにこれはCのメモリを解放する正しい方法ですか?

typedef struct ArrayStruct{ 
float * array; 
size_t used; 
size_t size; 
}Array; 

は、私はそれを初期化します。

void initArray(Array *a, size_t initialSize) { 
    a->array = (float *)malloc(initialSize * sizeof(float)); 

    if(a->array){ 
    } 
    else{ 
     printf("OUT OF MEMORY 1!!\n\r"); 
    } 

    a->used = 0; 
    a->size = initialSize; 
} 

私の質問は:次のコードは、によって利用されているすべてのメモリを解放するための正しい方法です構造体:

void freeArray(Array *a) { 
    a->array = NULL;  
    free(a->array); 
    a->used = 0; 
    a->size = 0; 
} 

助けてください。ありがとうございました。あなたは、ポインタが実際にそれを解放する前にNULLに解放されるように設定されているため:)

+3

後にNULLに設定する必要が働くようにするには、そうではありません。 –

+0

うん。私もそう思いました。しかし、もし私がそうすれば、プログラムは止まる。 :/ –

+2

あなたが表示されない別の問題があります。おそらく、これには[MCVE](http://stackoverflow.com/help/mcve)が必要です。 –

答えて

3

いいえ、これは、freeを行うための正しい方法ではありません。それ以外の方法で行う必要があります。

free(a->array); // Free the memory 
a->array = NULL; // Clear out a dangling pointer 

空の条件分岐を持つパターンも疑問です。むしろ

if(a->array){ 
} 
else{ 
    printf("OUT OF MEMORY !!!\n\r"); 
} 

を行うよりも、あなたは割り当てが失敗したときにもゼロにa->sizeを設定する必要があり

if(!a->array){ 
    printf("OUT OF MEMORY !!!\n\r"); 
} 

行う必要があります(現在、あなたのコードでも失敗した配分にinitialSizeにサイズを設定する場合にフォールスルー):

freeArrayが間違った順序を使用していることを
if(!a->array){ 
    printf("OUT OF MEMORY !!!\n\r"); 
    a->used = 0; 
    a->size = 0; 
    return; 
} 
2

。最初にa->arrayNULLに設定し、次にfreeNULLポインタを割り当てようとします。これは機能しません。関数内の最初の2行を交換する必要があります。最初にfreeとし、ポインタをNULLに設定します。

void freeArray(Array *a) { 
    free(a->array); 
    a->array = NULL; 
    a->used = 0; 
    a->size = 0; 
} 
2

あなたが行うと、この:

:あなたが最初のポインタにNULL代入されている

void freeArray(Array *a) { 
    a->array = NULL;  
    free(a->array); 
    a->used = 0; 
    a->size = 0; 
} 

、あなたは、いくつかのdocumentationを探してNULLポインタを自由に呼び出したときに何が起こるか見てみましょうvoid free(void * ptr);以前に malloc()、calloc()、aligned_alloc(C11以降)またはrealloc()によって割り当てられた領域の割り当てを解除します。 ptrがヌルポインタ の場合、関数は何もしません。

何も起こりません。何も割り当てを解除していないので、もうメモリへの参照がないため、メモリリークが発生しています。

が、それはあなただけの順序を変更すると明らかに

void freeArray(Array *a) { 
    free(a->array); 
    a->array = NULL;  
    a->used = 0; 
    a->size = 0; 
} 
関連する問題