2013-11-04 22 views
0

第一情況下,最好的分配方式:這是在C++

void func(int size) 
{ 
    int arr[size]; 

    for(int i=0;i<size;i++) 
    arr[i]=1; 

    for(int i=0;i<size;i++) 
    cout<<arr[i]; 

} 

int main() 
{ 
    func(6); 

    return 0; 
} 

or, 

第二殼體

void func(int size) 
{ 
    int *ptr = new int[size]; 

    for(int i=0;i<size;i++) 
    ptr[i]=1; 

    delete[] ptr; 
} 

查詢

是什麼區別以下兩種(這裏是第一種情況動態分配)?

哪個是最好的使用(因爲元件6,第一是最好的選擇)?

之所以稱之爲第一種情況動態堆棧分配?

+1

有沒有辦法告訴沒有上下文,但我一般避免這兩個(假設你甚至只是一個模板尺寸更換VLA)有利於集裝箱,提供超出這些好處的。 – chris

+0

有一件事值得一提的是,如果尺寸比較小,你可以分配數組在棧上,以避免不必要的新的循環浪費和刪除操作:) –

+0

@克里斯是的,我會記住這一點。 – user1502952

回答

5

第一個不是C++ —當前標準(C++ 11)不允許使用可變長度數組,它可能是C++ 14,但尚未發佈。如果你的編譯器編譯得很好,那麼它只是一個編譯器擴展:如果你使用GCC,編譯它爲-pedantic-errors,你會看到錯誤。

第二個是不好的解決方案:任何資源都應該包裝在資源管理類中,通常稱爲RAII類。讓它們像這樣打開是一個危險的想法。在這個網站上搜索RAII,你會看到很多主題。

有一個出色的解決方案:使用std::vector<int>

+0

第一種情況下編譯和運行良好 – user1502952

+0

@ user1502952:如果您使用GCC,用'-pedantic-errors' – Nawaz

+1

編譯您可能希望進一步解釋爲什麼第二種情況通常是一個壞的解決方案(即堆的機率增加腐敗)。 –

1

兩者完全相同。唯一的區別是,在VLA(可變長度數組)中,編譯器負責分配,取消分配等。因此,VLA簡化了程序的存儲管理,因爲一些需要手動使用新的和刪除的用途可以被替換爲沃拉斯。
請注意,兩者都使用堆段進行內存分配。
閱讀:http://www.drdobbs.com/the-new-cwhy-variable-length-arrays/184401444
嗯,我會建議你使用STL矢量類,它具有負載的功能,並不打擾你與這樣的問題,並且很容易相處。
這就是:http://www.cplusplus.com/reference/vector/vector/

+1

但他們都不使用「堆棧」。至少不是陣列。 – juanchopanza

+0

@Sahil Sareen感謝您提供良好的鏈接。 – user1502952

+0

@ juanchopanza感謝您的糾正。 –