2016-09-08 6 views
2

私はforループを持つ関数を持っていて、ループの中で(そして入力に応じて)、ある変数はmalloc()を使って(最初の)一度初期化されます。静的に動的に割り当てられたポインタをfree()する必要はありますか?

これらの変数は次のように宣言されています

static double *vector;

、その後、私は質問がある

malloc(size*sizeof(double)); 

を使用してメモリを割り当てる:

私はこれらの変数を解放する必要がありますか呼び出された関数の中のループの最後の反復かどうか?

更新:多分私は何人かの人に間違って説明したかもしれません。これは、呼び出される関数(func_A)は、main関数からの入力に応じて使用する特定のベクトルにメモリを割り当てます。そして、このfunc_Aはメインのループから数回呼び出されます。そのため、変数を静的変数と定義し、func_Aが呼び出されるたびに定義されないようにします(時間消費のために)。ディメンションは実行全体を通して変化しないためです。変数は静的ですがグローバルではないので、私はメインから解放することはできません(右?)。

+0

答えは「依存します」です。プログラムを終了する前と最後に使用した後にメモリを解放する必要があります。 – DevSolar

+2

もう不要になったら解放してください。 –

+0

http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc?rq=1 – jamesdlin

答えて

3

いつもは、freeを呼び出してmallocと平衡します。

vectorが不要になったときに電話することができます。

これが実用的でない場合は、いつでもatexitに電話をかけることができます。メモリに適切な関数へのポインタを渡します。freeメモリ。 http://www.tutorialspoint.com/c_standard_library/c_function_atexit.htm

プログラム終了時にあなたをきれいにするためにオペレーティングシステムを使用することはよくありますが、それに頼るのはむしろ原油です。

+0

先生、もし私が聞いたら、 'atexit()'で 'free()'や同等のものを呼び出すのはどんな意味ですか?とにかくプログラムの終了時に、メモリは再利用されますか? –

+2

すばらしい光沢のあるオペレーティングシステムが、実際にあなたのためにそれを行うでしょうが、Cの標準的な観点からそれが起こっているという保証はありません。よく書かれたソフトウェアは、それ自身の後で常に清めます。 – Bathsheba

+0

"あなたはいつも' atexit'を呼び出すことができます... "Er、必ずしもそうではありません。 'atexit'で登録できるコールバックの数には限界があります。したがって、それを直接使うことはうまく拡張できません。 (制限を回避するために、独自のコールバック登録システムを作成し、1つの 'atexit'コールバックでそれを起動させることができます)。 – jamesdlin

0

呼び出された関数内のループの最後の繰り返しでこれらの変数を解放する必要がありますか?

あなたをすることができますが、する必要はありません。

は、free()になります。メモリアロケータ機能によって割り当てられたメモリは、もはや必要ありません。

malloc()を使用してメモリ割り当ての主要な目的の一つと家族は、ローカル変数のスコープに関する制限を克服することである(関数からローカル変数の返すアドレスが違法である)、あなたはfree()する必要はありませんので、メモリ"呼び出された関数内"。ポインタ(malloc()によって返される)を呼び出し元に戻し、そのポインタ(メモリ)で他の操作を実行し、サブ関数の呼び出し元からポインタをクリーンアップ(free())することができます。

覚えておいていただきたいことは、元々malloc()またはファミリによって返されたfree()への正確なポインタを渡す必要があります。

0

データがもう使用されないときは、すべてのmalloc呼び出しに対応するフリーコールが必要です。

+0

いいえ、それは良いプログラミングスタイルですが、あなたが強制するものではありません。実際に必要とされるのは、 'malloc(3)'や既に 'free(3)'で取得していないものについて '決してfree(3)'を呼び出さないことです。 –

0

ポインタを解放する必要があります。 経験則として、malloc/newで割り当てたものはすべてヒープ上にあり、空き/削除する必要があります。その他はスタック上にありません。

p.s.java/go/pythonのようなgrba​​geを使用した言語しか使用していない場合は、これを知る必要はありません

0

ベクトルは一度割り当てられてからprorgamの存続期間中に使用されるようです。ベクトルは静的変数に格納されます。プログラムを終了する前に、ベクターを解放することをお勧めしますが、終了はあなたのためにも行います。

プログラムの有効期間中、異なる(特に:より大きい)ベクトルサイズで機能するように準備されていないようです。

関連する問題