bugfix> c > 投稿

私は人々が私にドキュメントを読むように言い続けていることを知っています、そして私はまだそのコツをつかんでいません。ドキュメント内で具体的に何を探すべきかわかりません。ドキュメントの読み方に慣れるためのヒントがあれば、ボーナスとしてヒントを教えてください。しかし、今のところここに私の質問があります。簡単なプログラムで言う allocate できるメモリのチャンク free 終わったらねこれは、割り当てと割り当てを行うだけのプログラムの1つです。 deallocate ヒープ内のメモリ。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *s = malloc(10);
free(s);
return (0);
}

これをコンパイルした後、実行すると valgrind すべてが解放されていることがわかります。ここで、前のプログラムに少しひねりを加えました。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *s = malloc(10);
s++;
free(s);
return (0);
}

解放する前に、アドレスを1つインクリメントすると、すべての地獄が解き放たれます。このメモリチャンクが割り当てられたので、Freeは今ではないようです(割り当てられたメモリのサブセットですが)。あなたがそれを見たい場合のために、ここに私のエラーメッセージがあります。

*** Error in `./a.out': free(): invalid pointer: 0x0000000001e00011 ***
Aborted (core dumped).

だから、これは私に考えさせました。

  • cはヒープに割り当てられたメモリを追跡しますか
  • そうでない場合、何を解放し、何を解放しないかをどのように知るのですか?
  • そして、それがそのような知識を持っているなら、なぜ自動的にcしないのですか? deallocate 出る直前のそのような思い出。なぜメモリリークが発生するのですか?
  • 回答 1 件
    • のC標準の説明 free 次のように言います:

        The free 関数により、が指すスペースが発生します ptr 割り当てが解除される、つまり、さらに割り当てられるようになります。 If ptr はnullポインタであり、アクションは発生しません。それ以外の場合、引数がメモリ管理関数によって以前に返されたポインタと一致しない場合、またはスペースがfreeまたはreallocの呼び出しによって割り当て解除された場合、動作は未定義です。

      ポインタを変更したため、メモリ管理関数によって返されるポインタと一致しません(つまり、 m/re/calloc )、動作は未定義、そして何でも起こり得ます。無効なポインタを解放しようとしたことに気付くランタイムライブラリを含みますが、ランタイムもそれを行う必要はありません。


      はどうかと言うと

        Does C keep track of memory's allocated on the heap

      それは...かもしれませんが、必ずしもそうする必要はありません...

        If not, how does it know what to free and what to not?

      まあ、それがポインタによってポイントされたメモリを解放するなら、それは明らかに割り当てのサイズについてある種の簿記を持っている必要があります...しかしそれはポインタがまだ指しているかどうかを理解することができる必要はありませんそのメモリ領域に。

        And if it has such a knowledge, why doesn't c automatically deallocate such memories just before exiting. why memory leaks?

      通常、メモリは、プロセスがオペレーティングシステムによって終了した後に解放されます。それは問題ではありません。本当の問題は、プログラムの実行中に発生するリークです。まだ実行されています

    あなたの答え