2

私は主にJavaの人で、最近Cに関連するいくつかのプロジェクトに取り組んでいます。基本的なCの質問である場合は、ご容赦ください。

したがって、メインの内部にはwhileループがあり、反復ごとに変数を宣言します。

int main()
{
  int done = 0;
  while(!done)
  {
    char input[1024];
    scanf("%s", input);
    //parse the input string
    ...
  }
} 

これで、入力変数はユーザーの希望に応じて毎回変更されるため、毎回「新しい」変数を使用する必要があります。ただし、上記の宣言は最終的にメモリリークを引き起こすと思います(またはそうなるでしょうか?)。gccがガベージコレクションを処理するかどうか知りたいのですが。

すべての反復の後に割り当てたり解放したりせずに、より良いアプローチはありますか?

4

3 に答える 3

6

上記の宣言は、最終的にメモリリークを引き起こすと思います(またはそうなるでしょうか?)。

いいえ、そうではありません:input自動(別名「スタック」) 変数であり、スコープ外になるとすぐに (つまり、右中括弧の後)、「割り当て解除」されます。

反復ごとに割り当てと解放を行わずに、より良いアプローチはありますか?

実際の割り当てや割り当て解除は行われません。自動メモリ (別名「スタック上」) 内のスペースは、スタック ポインター周辺のコンパイル時のブックキーピングによって割り当てられます。自動変数へのアクセスは、ハードウェアによって大幅に支援される非常に高速な操作であるため、効率が低下することはありません。

動的メモリ割り当て (Java スタイル) はC のmalloc/ calloc/で行われます。これらはガベージ コレクションではありません。割り当てたすべてのポインターreallocを明示的に行う必要があります。free

于 2013-01-14T22:31:33.357 に答える
1

ただし、上記の宣言は最終的にメモリリークを引き起こすと思います(またはそうなるでしょうか?)

ならない。オブジェクトは、ループの最後にinput到達するたびに破棄されます。}

于 2013-01-14T22:31:43.643 に答える
0

他の人がすでに言ったように、スタック変数はスコープ外になると自動的に解放され、通常はすぐに上書きされます。

そうは言っても、私がこの回答を書いている理由は、これを強調するためです。少なくともデフォルトでは、 C にはガベージコレクターはありません。これは、ヒープに割り当てられたメモリ (通常は などで初期化mallocされる)callocを ( を使用して) 手動で解放する必要があることを意味しますfree

于 2013-01-14T22:38:21.647 に答える