2012-03-20 16 views
2

私はこの関数でvalgrindを実行すると、私は間違いなく4バイトを失ったと言います。私はx = yでポインタxをリダイレクトしているため、最初の行に割り当てられた最初のメモリへのアクセスが失われていることがわかります。これをどうやって解決するのですか?ここで正しい原則は何ですか?私はちょうどCを学んでいるので、私はこのすべてのハングアップを取得しようとしています。ありがとう!Cメモリリークでポインターをリダイレクト

int main() { 
    int* x = malloc(sizeof(*x)); 
    int* y = malloc(sizeof(*y)); 
    *x = 2; 
    *y = 5; 
    x = y; 
    *y = 6; 
    *x = 4; 
    printf("y = %d\n", *y); 

    free(x); 
    free(y); 

    return 0; 
} 
+0

こんにちは、ジェイソンは右です – madper

答えて

2

xがintを指していた場合、そのアドレスはx = y;(予想通り)で上書きされましたが、前のアドレスが指し示したスペースは解放されませんでした。xyには同じアドレスが含まれているため、両方ともメモリ内の同じスペースを指しています。したがって、free()コールは両方とも同じ場所を解放しようとしています。

あなたが割り当てるときだけx = y;

+0

偉大な、これは私が探しているものです!私はコードがあまり有用ではないことを知っていますが、それは私が学びたいという概念です。ありがとう! – quantum

3

私は答えは怖い:free配分あなたも一緒に行われているとが、それ以前にそれらのない失うトラックを行うとき。

今あなたがしなければならないすべての問題が発生したことを確認することで艇の深いボディを学ぶです...として


はさておき、あなたは二重のfree「別のバグである上に、単一の割り当てを編しています。

5

あなたはもともとyに割り当てられたポインタ値を失うことがないように、最初の一時的なポインタ変数に、あなたの値を割り当てていることを確認して、適切なスワップidomを活用:

int* tmp = x; 
x = y; 
y = tmp; 

これをラップすることができますvoid swap(void** a, void** b)関数では、コードを一時変数で捨てる必要がありません。

void swap(void** a, void** b) 
{ 
    void* tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 

のようになります。のようになります。 xy変数が同じポインタ値を含んでいるので

はまた、今のように、固定ポインタスワップせずに、コード

free(x); 
free(y); 

は二重解放の一例です。ダブルフリーズすると、未定義の動作になるので、そのようにする必要はありません。適切なスワップイディオムを使用することでそれを防ぐことができます。

0

あなたはyを2回解放し、xは決して解放しません(xはyの値を保持するため)。

さらに、返信を受け入れるのはなぜですか?人々があなたを助けようとする傾向があるかもしれません。

+0

彼が何をしたかを注意深く見てください。後で型が変更されたとしても、割当権利のサイズが常に得られます。これにより、あなたの提案よりも堅牢になります。 – dmckee

2

あなたは、整数の値を割り当てるために探している場合xで指される整数にyで指さ、あなたはおそらく望んでいた:

*x = *y; 

あなたがやっている割り当てが値を上書きしているxの値を使用して、整数が格納されているメモリにアクセスすることはできません(逆参照するなど)。

ところで、あなたの現在のコードで漏れるのに加えて、あなたも行うダブル無料xyためにも(大きな)問題で同じ値を持ちます。

2

free(x);に入れ、それらの4つのバイトをリークしたくない場合は、次の

x = y; 

あなたがに保存されているポインタ(previosuly割り当てられたメモリへのアドレス)を失いますx。 それを解決するには、ただしないでください。あなたが二回同じメモリを解放するためにattemtingされているので、

free(y); 

:あなたが行で(通常は後で)あなたのプログラムのクラッシュを意味するかもしれ未定義の動作を引き起こすことを行う場合。

私はあなたがすべきことを行うには、割り当てられたメモリに格納された値ではなく、アドレスを割り当てるしたいと思われる:

代わり
*x = *y; 

- あなたの「失われた記憶」の問題と未定義の動作を解決すること(二重無料)。

関連する問題