2014-03-26 36 views
0

在下面的代碼中,我將多個整數數組分配給一個指針。在每次調用時,指針的地址都是相同的,至少在我運行它時。如果我不使用delete [] y,那麼這個過程將會被殺死而不會拋出任何異常。如果我添加該行,該過程將永遠運行。本地變量的C++內存管理內存分配

我的問題是,因爲在這兩種情況下(使用或不使用delete)指針的地址在函數調用之間保持不變,這是否意味着分配內存中的相同空間?如果是的話,爲什麼在一個案例中這個過程停了下來,而另一個呢不是?

在一個更普遍的問題中,函數返回時用於局部變量的內存會發生什麼變化?內存管理策略在常規變量和指針之間是不同的嗎?

#include<cstdio> 
#include<iostream> 
#include<exception> 
#include<new> 

using namespace std; 

void foo(); 

int main() 
{ 
    while(true) 
    foo(); 
} 

void foo() 
{ 
    try{ 
      int *y=new int[1000]; 
      printf("%X\n",&y); 
      // delete [] y; 
     } 
    catch(exception &exc){ 
      cerr<< exc.what(); 
     } 

} 
+0

您可能會發現'std :: cout'比'printf'簡單 – OMGtechy

回答

4

您正在打印指針變量的地址,而不是分配區域的地址。試試這個看分配區域的地址:

printf("%p\n", (void*)y); 
+0

爲什麼要轉換爲'void *'? – user2079303

+1

轉換爲void *使代碼符合標準。無論如何,它在任何普通的現代平臺上都很有可能起作用,但%p的相應參數應該是void *類型的,這被標準允許具有不同的內部表示(例如,更多位),而不是int *。 –

1

如果delete指針,那麼你可以得到new在每次調用相同的值。如果指針不是delete,那麼您將永遠不會獲得返回的相同指針,因爲函數必須分配新內存,並且系統無法重新使用以前刪除的內存。

您動態分配的內存將保留分配給進程的其餘部分,它不是「本地」,就像變量可以是本地一樣。如果你沒有釋放(通過使用delete)內存,那麼你有內存泄漏。

0

用於局部變量的函數返回時被下一個函數調用和下一個函數的局部變量重複使用的內存。