2012-04-15 8 views
0

これは基本的な質問ではありません。C++のforループの変数に新しいオブジェクトを代入する

int *a; 
while (1) { 
    a = new int(1); 
    // Do stuff with a 
} 

とは対照的に、どちらの場合も、オブジェクトの同じ数を動的に割り当てられている

while (1) { 
    int *a = new int(1); 
    // Do stuff with a 
} 

を行っている間に違いがあります場合、私は思ったんだけど。しかし、最初の例のループ内でintキーワードが使用されているという事実は、使用されるメモリに影響しますか?

+2

ここで 'new'を使用する理由はありますか? – Pubby

+0

私は動的に割り当てられたオブジェクトを必要とするコンテナクラスを持っていました。私はちょうど興味があった。 – gsingh2011

答えて

4

差はスコープです。

while (1) { 
    int *a = new int(1); 
    // Do stuff with a 

    // Don't forget to delete a. 
} 

// Cannot access `a` here... 

に対し:

int *a; 
while (1) { 
    a = new int(1); 
    // Do stuff with a 

    // Don't forget to delete a. 
} 

// Can access `a` here. 

あなたはあなたの例の両方でa memory leakを持っています。好ましいのはsmart pointers

+0

最初の例で、ループの各繰り返しを再作成したかどうかはわかりませんでした。そして確かに、削除aがどこかにあることが暗示されました。ありがとう。 – gsingh2011

+0

私はそれが暗示されたとは思わなかった。あなたが実際にやろうとしていることは何ですか? – Johnsyweb

+0

動的に割り当てられたオブジェクトだけを受け入れるコンテナクラスを使用する必要がありました。変数 'a'で何が起こっているのか不思議でした。 2番目の例では同じリファレンスが使用されましたが、最初は新しいリファレンスがメモリに作成されているかどうかわからず、古いリファレンスはプログラムが終了するまでスタックに置かれます。あなたが言っていることから、たとえintとして再宣言しても同じリファレンスが使われますか? – gsingh2011

4

これらは本質的に同じであり、ほぼ確実に同じにコンパイルされます。たとえそうでなくても、ヒープ割り当てを行っているという事実は、余分なスタック1よりもコストがかかります。

より厳密なスコープがあるため、最初のものを優先します。

関連する問題