簡體   English   中英

int someInts [3]和int * someInts = new int [3]之間的區別?

[英]Difference between int someInts[3] and int* someInts = new int[3]?

通過使用int someInts[3]聲明新的整數數組與使用int* someInts = new int[3]聲明之間有什么區別?

有兩個主要區別:

  1. 第一個將在堆棧上分配一個內存,一旦函數返回,該內存將不可用。
    第二個將在freestore上分配一個內存,該內存在刪除之前將一直可用。

  2. 第一個someInts是一個整數數組,您不能為其分配新地址。
    第二個是指向int的指針,因此您可以為其分配一個新地址。

通常重要的區別是(特別是當您處理int以外的其他東西時)是使用后者( int *someints = new int[3]; )時,您必須顯式刪除數據完成使用它。

大多數時候,您想使用std::vector<int> someints(3); 代替。 這將(通常)類似地為數據分配空間, 但是當變量超出范圍時,它將自動刪除該空間(例如,包括通過引發異常而離開范圍,這更難處理)手動分配/釋放內存時正確顯示)。

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

當您執行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

因此,當堆被指針等占用時,您不會以內存泄漏而告終。

這取決於您使用的情況,因為兩者在各自的情況下都更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM