2013-02-07 142 views
0

我知道,如果我新的一些陣列我必須刪除它:動態數組分配C++

int *i=new i[10]; 

    delete[] i; 

什麼靜態數組一樣:

int i[100]; 

OR

int i[]={1,2,3,4}; 

應該的被刪除?

asume波紋管代碼:

bool fu() 
    { 
     for(int i=0;i<100;i++ 
     { 
     int j[]={1,2,3,4}; 
     } 
     return 0; 
    } 

爲j []從去客場RAM(返回0;)時也依然存在,使RAM很多的迭代之後滿了嗎?

因爲我想在微型程序上有點擔心。 thanx

+3

'刪除'你'新'。沒有其他的。更好的是,使用RAII。 – chris

+2

@chris因爲這是'RAII't要做的事情。 :) –

+1

@chris:有人問這個問題不太可能知道RAII是什麼......一個鏈接或解釋可能會有所幫助。 –

回答

3

什麼樣的靜態數組:

int i[100]; 
int i[]={1,2,3,4}; 

它應該被刪除?

不......兩者static數據(當像這些定義出現之外的任何功能範圍時使用)和堆棧基於數據(函數內使用的變量)被自動破壞(如果需要),當程序終止或範圍退出分別。 static變量的內存不需要由程序明確「釋放」 - 程序終止時操作系統將回收內存。堆棧內存有點像海灘上的波浪...隨着示波器進入和退出,使用相同的內存(認爲在海灘上的區域)(被覆蓋)然後自動釋放,然後重新使用....

bool fu() 
{ 
    for(int i=0;i<100;i++ 
    { 
    int j[]={1,2,3,4}; 
    } 
    return 0; 
} 

在這裏,j[]被重新創建在堆棧上 - 可能每次通過循環的地址都在同一個地址,儘管C++標準沒有討論這種實現細節 - 但是可以通過從常量(靜態)數組中複製數據來重新初始化, 1,2,3,4}是爲此目的而存儲的。 (如果優化器推斷你永遠不會改變它,它可能會跳過重新初始化,甚至直接刪除堆棧變量並訪問常量數組值,甚至刪除常量數組,並將訪問的特定值移動到機器代碼操作碼中的立即值 - 優化器可以做任何事情,只要它不影響程序性能以外的其他任何事情)。

3

您不需要刪除這些。它們在內存中的堆棧中,而不是堆中,並在你離開它們的範圍後立即清除。

而在你的例子中:當你離開循環時,j被清除。

+0

「靜態數組怎麼樣」 - 這個問題特別提到「靜態」數據,所以「他們在堆棧中」是不正確的。當然,mefmef可能也應該瞭解堆棧的情況,但解決'靜態'數據是必要的,以回答這個問題.... –

2

不,一般來說堆棧中的變量不能被刪除。

+1

*「一般」*? –

+0

是的,在使用貼圖新建或其他方式時可能會出現角落案例。 – Axel

+0

良好的捕捉,你贏得了我的+1 :) –

1

找到解釋,您聲明「靜態」數組,因爲這,

靜態INT I [100];

分配給100個整數的內存保留了整個程序的使用期限。但對於此,

INT I [100]

存儲器被獲得免費和熄滅堆(因爲這是本地的),而該超出範圍。