2017-01-31 5 views
0

私はメモリ領域(構造体、配列)へのポインタを介してメモリにたくさんのものを格納するこのプログラムを持っており、いつでもプログラムを初期化できるこのユーザを持っています。 initを実行すると、プログラムは以前に使用されたメモリを解放しなければならず、それがキャッチです。Cの空きメモリ:有効なポインタを確認する方法?

最初のinitでは、私のポインタが指しているものは何もわかりません。特に、それらがゴミであるかどうかはわかりません。しかし、そうでない場合は、彼らが指しているものを解放する必要があります。どのように私は知っていますか?

+3

あなたは単純にできません。 – George

+0

@George私は恐れていました。アイデアが私の頭の中に飛び込んできました。最初のinitをmallocingだけで分離して解放しないようにしました。システムがちょうど新しく始まりました。初めてのものですから、私は「reinits」と呼んで、以前のmallocの後で、ポインタとmallocの背後にあるものを解放することができます。 Stackoverflowは、他の人よりもむしろインスピレーションを通じて答えをもたらすことがあります。 – Charles

+0

ポインタの "簿記"を行う必要があります。もう何も必要ないときはいつでも解放し、ポインタをnullに設定します。あなたのinitでは、nullでないものは解放されなければならない有効なポインタです。 –

答えて

3

NULLを指すポインタが何も指していないことを除いて、与えられたポインタが何か有効なものを指すかどうかをチェックする方法はありません。動的メモリを指しているポインタを追跡するのはあなたの仕事です。 (ポインタは自動とstatic変数を指すことができますし、もちろんあなたはそれをfreeするないしよう。しなければならない)、彼らはfree D関連のメモリを持っており、その事実に依存していたら、フォークの

プレンティNULLへのポインタを設定しますC標準では、no-opとしてfree(NULL)が定義されています。だからあなたはそのアプローチを採用することができます。

しかし、潜在的なバグを隠すことができるので、この種のコードには依存しすぎることがあります。あなたのメモリ管理にもっと注意してください。

それとも、自分でこれらのいずれかを構築することができ:https://en.wikipedia.org/wiki/Boehm_garbage_collector

+1

例えば 'static int * ptr = NULL;' ... 'void' create_stuff(void){free(ptr);}のようなコードを持つことは、 ptr = malloc(...)} '...' voidクリーンアップ(void){フリー(ptr); ptr = NULL; } '。つまり、これらの関数はいつでも、任意の順序で、実行中に複数回呼び出すことができます。オブジェクトを作成および破棄する際の柔軟性が向上し、コードは常に安全な状態になります。同じ "デザインパターン"は、スレッドハンドル、ファイルハンドルなど、他の種類のリソースにも使用できます。 – Lundin

+0

ポイントを獲得しました。私は注意書きを少し柔らかくしました。しかし、駄目なコードを書き込むための言い回しとして 'NULL'を使用しないでください。 – Bathsheba

3

我々はここでグローバルについて話していますか?自動的にゼロに初期化されるためです。一般に、あなたのプログラムは、ポインタがゴミを指すことはありませんが、有効なデータかNULLの値をとるように書くべきです(free(NULl)はノーオペレーションです)。

+0

はい、ファイルスコープですが、違いはありません。 http://stackoverflow.com/questions/13251083/the-initialization-of-static-variables-in-c – Charles

関連する問題