0

私は主に高水準のプログラミング言語で作業しています、昨日、友人から簡単な C++ の課題を解決するのを手伝ってほしいと頼まれ、作業中に次のコードを書きました。

for (int x = 0; x < 10; x++){
    int a, b, c;
    a = x;
    b = x*2;
    c = x+5;
}

ここでの私の質問は次のとおりです。これにより、a、b、c が常にメモリの異なる場所に作成されるメモリ リークが発生しますか、それともループごとに常に上書きされますか?

4

5 に答える 5

10

メモリ リークが発生するのは、変数を動的に割り当てた場合 (またはまたはまたはを呼び出しnewnew []malloccallocて) のみです。あなたのコードには何もないので、NO .

あなたが持っているのは、ローカル変数または自動変数です。名前が示すように、自動変数は、{}それらが作成されたスコープが終了すると、暗黙的に割り当てが解除されます。

于 2013-02-22T15:13:14.087 に答える
3

a、スタックbc割り当てられます。型自体がコンストラクタやデストラクタを介してリークを引き起こさない限り、自動変数がメモリ リークを引き起こすことは決してありません。

彼らが各ループを上書きするかどうかの問題に関して: 私は、地球上のすべてのコンパイラがそのようにそれを行うと強く疑っていますが、原則として、これは保証されていません. アセンブリ出力を見ると、(a) すべての変数がレジスタ内にあるか、(b) スタック ポインターから固定オフセットとして取得されていることがわかります。ループのたびに同じアセンブリが実行されるため、実際には上書きされます。

于 2013-02-22T15:13:59.873 に答える
2

あなたは3つの質問をします:

これにより、メモリリークが発生します

いいえ、ここではメモリリークはありません。この用語が一般的に使用されているように、メモリリークには、newなし、なしdeletenew[]またdelete[]はなしが必要malloc()ですfree()

a、b、cは常にメモリの異なる場所に作成されます

彼らはそうかもしれません。彼らはそうではないかもしれません。これは、プログラムが意識する必要のない実装の詳細です。知っておく必要があるのは、オブジェクトがそれらを定義する行で作成され、そのスコープの閉じ中括弧で破棄されることだけです。

それらは常にすべてのループで上書きされますか?

彼らはそうかもしれません。彼らはそうではないかもしれません。これは、プログラムが認識する必要のない実装の詳細です。それらが上書きされるかどうかに関係なく、ループの周りで毎回破棄されます。

于 2013-02-22T15:16:51.423 に答える
0

メモリ内の同じ場所が、ループのすべての反復でabおよびに値を格納するために使用されます。c

于 2013-02-22T15:15:17.793 に答える
0

このような変数を作成すると

int i = 5;

コンパイラはそれらをスタックに置きます。int の割り当てを解除する必要はありません。ただし、ヒープに int を作成すると、

int* i = new int; /*C++ style*/
int* j= (int*) malloc(sizeof(int)); /*C style*/

次のようにメモリの割り当てを解除します。

delete i; /*C++ style*/
free(j); /*C style*/

そうしないと、メモリリークが発生します。最も重要なのは、C と C++ スタイルのメモリ処理を混在させたくないということです。

于 2013-02-22T15:20:32.153 に答える