作成日:2002.10.9
修正日:2004.01.8
{この場合、 プログラムが終了するまで回収できない メモリ領域が プロセス中に残ることになります。 これをメモリリークと呼びます。 メモリリークが積もって行くと、 使用可能なメモリが増えてゆき、 プログラムを停止せざるえなくなります。
{
char* p = (char*)malloc( SIZE ); /* (1) */
}
/* 変数 p がスコープの外に出ると、(1) によって確保された
メモリ領域は解放不能 */
}
void foo(char** p) {ダングリングポインタの中で 最も発見が見つけ辛いのが、 本来 正常なオブジェクトを指していたポインタが、 参照しているオブジェクトが解放されたために ダングリングポインタを指してしまうパターンです。
char c;
*p = &c;
}
char* p = NULL;
foo(&p);
/* p は不正なメモリアドレスを指している */
char* p = (char*) malloc(SIZE);解放された領域が、 次回以降のメモリ割り付けで再利用されている場合、 不正な書き変えを行ってしまいます。
free(p);
char* q = (char*) malloc(SIZE);
/* p は不正なメモリアドレスを指している */
/* もしかすると p == q で、p を書き直すと q の内容が変わるかも */
ライブラリを使うために必要な include ファイルはインストールされていません。 gc6.1/include の下のファイルを、適当なディレクトリにコピーしておきましょう。> tar xzvf gc6.1.tar.gz
> cd gc6.1/ > ./configure > make > make check > su # make install
LD_LIBRARY_PATH にライブラリをインストール先のディレクトリを入れます。 (Linux なら ld.so.conf にインストール先のディレクトリを追加して、 ldconfig コマンドを実行しましょう。)# cp -r include /usr/local/include/gc