2012-06-19 205 views
1

如果我使用一個循環如下:循環和調用堆棧

ostringstream glob; 
    glob << "some words"; 
    cout<< "this is bob"<<glob.str()<<endl; 

水珠復位每次迭代。但是,如果我在循環之外聲明glob,那麼每個迭代都會添加「一些單詞」,從而導致更長和更長的字符串。

我想理解爲什麼。這是因爲這個變量每次循環都會彈出堆棧嗎?

我想,如果我是「redclaring」來代替每個循環,那麼我會得到一個錯誤,但我不....

回答

2

爲了澄清,你問到這個問題之間的區別:和

ostringstream glob; 
for (int i = 0; i < 100; ++i) 
{ 
    glob << "some words"; 
    cout<< "this is bob"<<glob.str()<<endl; 
} 

這樣的:

for (int i = 0; i < 100; ++i) 
{ 
    ostringstream glob; 
    glob << "some words"; 
    cout<< "this is bob"<<glob.str()<<endl; 
} 

在第一個,「水珠」被初始化一次,在循環之前,作爲其範圍在循環體外部。第二個'glob'位於循環體內(在定義循環範圍的大括號內),因此新放置在堆棧上並且每次迭代初始化(並在每次迭代結束時被銷燬)。

3

如果聲明範圍內的變量,則創建(構造)每你進入循環的時間(它在堆棧上)。如果你將它聲明在循環的外部,而不是單個實例,那麼你一直在重複使用。

參見:

0

當水珠是在循環內,其範圍是在循環的每次迭代。所以,它在超出範圍時會被刪除(彈出堆棧),並在下一次迭代中重新創建(壓入堆棧)。

當glob在循環之外時,它的作用域是該方法,直到該方法完成後才被刪除。