2013-12-14 10 views
5

後、私は次のコードでこのエラーを持っているエラー:"解放されたポインタは割り当てられませんでした。" malloc、reallocの

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(points); 
    free(points); 
    return 0; 
} 
void other_stuff(point points[]){ 
    //stuff 
    realloc(points, number*sizeof(point)) 
} 

私は検索が、何の割り当てがありませんでした明確だっただけの例を発見しました。

ここでは、pointsを初期化するためにmallocを使用し、その後サイズをreallocに変更しました。だから私はfreeに来るとき、どのようにポインタが "割り当てられていない"ですか?

+0

'points'は' main'で宣言されています。 'other_stuff'はどうしたらそれにアクセスできますか? – AVP

+0

@AVPごめんなさい。編集しました。(自分のコードにありました) – OJFord

答えて

8

reallocは、メモリを新しい場所に移動することがあります(古いポインタを展開するのに十分な領域がない場合)。その場合は、新しいポインタを解放する必要があります。

この微調整してみてください。other_stuffハンドルを渡すことによって

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(&points); 
    free(points); 
    return 0; 
} 
void other_stuff(point **points){ 
    //stuff 
    point *temp = realloc(*points, number*sizeof(point)); 
    if(temp != NULL) { 
     *points = temp; 
     // and do your stuff 
    } 
    else { 
     // panic? memory reallocation failed. Deal with it gracefully. 
    } 
} 

を、私たちは、ポインタが指している場所の上に、しかし、ポインタ自体のアドレスにだけでなく、制御を与えます。これにより、メモリを動かすことができます。ハンドルは、メモリを動的に管理するための良い方法です。概念的には、ポインタへのポインタはいくつかのことに慣れています。

+0

-1 'realloc'が失敗した場合、メモリがリークしています。 'realloc'を使うときに一時的に最初に割り当ててから、結果をチェックします。 –

+0

@EdSあなたはそうです。私は自分の編集がそれを修正したと思う。 – Floris

+0

Downvoteが削除されました。 –

2

reallocは新しいポインタを返します。 そのは、関数が成功した場合に解放する必要があります(最終的には)。さもなければ、それは失敗し、あなたはこの場合のために古いポインタを保持します。

はどのようにreallocを使用するには:

whataver *f = malloc(count * sizeof(*f)); 
/* ... */ 
whatever *temp = realloc(f, new_count * sizeof(*temp)); 
if (temp) 
    f = temp; // realloc worked, f is no longer valid/needed 
else 
    free(f); // error 

realloc同じポインタを返すことがあり、またはそうではないことがあります。ポイントは、reallocが成功した場合、もはや元のポインタを気にしないということです。新しいブロックを割り当てる必要がある場合、元のポインタは無効です。それがなかったら、同じポインタを返し、あなたは確かその割り当てを解除したくありません。

+0

残念ですが、コードのメインにローカルではない点が私のOPを編集しました。 – OJFord

+0

@OllieFord:編集ではその問題は修正されませんでしたが、重要ではありません。 –

+0

それがうまくいけば、それは決して '自由になる'必要はありませんか? – OJFord

関連する問題