2012-02-21 225 views

回答

6

有2間主要的差異:

  1. 第一個將分配堆棧上的存儲器,那將是一次函數返回不可用。
    第二個將在freestore上分配一個內存,這個內存將一直存在,直到被刪除。

  2. 第一個someInts是一個整數的數組,你不能指定新的地址給它。
    第二個是int指針,所以你可以給它分配一個新的地址。

+2

根據您的角度來看,它可能沒有幫助「棧」和「堆」來區分,因爲這些都不是概念C++語言本身涉及的。 – 2012-02-21 01:16:59

+0

@OliCharlesworth - 感謝您的評論。你會用什麼詞來指出我提到的第一個區別? – MByD 2012-02-21 01:19:53

+0

@OliCharlesworth相反,RAII習慣用法是C++設計的一大問題。並且說,freestore不是RII中的R是不靈活的。 – 2012-02-21 01:20:34

0

聲明int* someInts = new int[3]在堆上分配內存。聲明int someInts[3]將它分配到堆棧上。

3

這種差異通常很重要(尤其是當您處理的不是int s時),當您使用後者(int *someints = new int[3];)時,必須在完成使用後明確刪除數據。

大多數情況下,您想用std::vector<int> someints(3);代替。爲數據,這將(通常)分配的空間同樣,當變量超出範圍(包括,例如,它會自動刪除空間,留下通過一個異常範圍被拋出,這是更爲困難在手動分配/釋放內存時正確處理)。

+0

+1:第一個答案,管理解釋的差異沒有提到實現特定的細節(堆棧與堆)。 – 2012-02-21 01:17:40

0

當你someInts [3],你在棧上分配內存,這意味着它會刪除自己(好),但如果你要訪問的功能已經結束,你會遇到麻煩之後,因爲它已經將已被刪除。 IE:

int* returnPointerThingy(){ 
    int someInts[3]; 
    someInts[0] = 3; 
    someInts[1] = 2; 
    someInts[2] = 1; 
    return someInts 
} 

這將返回一個空指針,因爲someInts已被刪除。如果你嘗試訪問someInts上帝幫助你。

如果這與您想要使用new關鍵字的操作類似。它將允許你在「堆」上分配一些東西,並且它會在它聲明的函數結束後繼續存在。因此:

int* returnPointerThingy(){ 
    int* someInts = new int[3]; 
    someInts[0] = 3; 
    someInts[1] = 2; 
    someInts[2] = 1; 
    return someInts 
} 

不會返回空指針,您將能夠使用someInts存儲的值。然而,這帶有一個缺點,你必須刪除someInts這樣的:

delete [] someInts 

所以你不要有內存泄漏最終,當堆被採取了由指針和這樣的。

這要看您的具體情況爲,其使用的都是在自己的情況更好。

相關問題