使用int someInts[3]
聲明一個新的整數數組與使用int* someInts = new int[3]
聲明一個新的整數數組有什麼區別?int someInts [3]和int * someInts = new int [3]之間的區別?
回答
有2間主要的差異:
第一個將分配堆棧上的存儲器,那將是一次函數返回不可用。
第二個將在freestore上分配一個內存,這個內存將一直存在,直到被刪除。第一個
someInts
是一個整數的數組,你不能指定新的地址給它。
第二個是int指針,所以你可以給它分配一個新的地址。
聲明int* someInts = new int[3]
在堆上分配內存。聲明int someInts[3]
將它分配到堆棧上。
這種差異通常很重要(尤其是當您處理的不是int
s時),當您使用後者(int *someints = new int[3];
)時,必須在完成使用後明確刪除數據。
大多數情況下,您想用std::vector<int> someints(3);
代替。爲數據,這將(通常)分配的空間同樣,但當變量超出範圍(包括,例如,它會自動刪除空間,留下通過一個異常範圍被拋出,這是更爲困難在手動分配/釋放內存時正確處理)。
+1:第一個答案,管理解釋的差異沒有提到實現特定的細節(堆棧與堆)。 – 2012-02-21 01:17:40
當你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
所以你不要有內存泄漏最終,當堆被採取了由指針和這樣的。
這要看您的具體情況爲,其使用的都是在自己的情況更好。
- 1. int * a [3]和int(* a)[3]之間的區別?
- 2. 「int * a = new int」和「int * a = new int()」有什麼區別?
- 3. 新的int和new(int)之間的C++有什麼區別?
- 4. int * x []和int(* x)[]之間的區別?
- 5. int p = *(int *)i和int p = *(int *)&i之間的區別
- 6. Arraylist <Interger> vs int [] list = new int [3];
- 7. make([] int,0),[] int {}和* new([] int)有什麼區別?
- 8. Java中的int a [5],int a [],int a [] = {2,3}之間的區別
- 9. Python 3中int()和floor()之間的區別是什麼?
- 10. C++中新int()和新int {}之間的區別
- 11. '(int)a','a as int'和C#中的Convert.ToInt32(a)之間的區別
- 12. C#中char和int之間的區別#
- 13. int,NSInteger和NSUInteger之間的區別
- 14. uint和unsigned int之間的區別?
- 15. Python 3.5 - '//'和'int()'之間的區別
- 16. int和Integer之間的區別
- 17. Int和Uint8之間的區別swift
- 18. void main和int之間的區別主
- 19. defaultdict(lambda:None)和defaultdict(int)之間的區別
- 20. foo(int * arr)和foo(int arr [])之間的任何區別?
- 21. int * p和int * p聲明之間的區別
- 22. 傳遞(int x)和(const int x)之間的區別
- 23. static_cast <int>(var)和*(int *)&var之間的區別是什麼?
- 24. int fpurge()和int fflush()之間的區別C
- 25. int和signed int聲明之間的區別
- 26. int main()和int main(void)之間的區別?
- 27. (int *)arr [2]和int * arr [2]之間的區別是什麼?
- 28. const int&x = 4和const int x = 4之間的區別
- 29. 「Convert.ToString(Nullable <int>)」和「Nullable <int> .ToString()」之間的區別?
- 30. 最終靜態int和靜態最終int之間的區別?
根據您的角度來看,它可能沒有幫助「棧」和「堆」來區分,因爲這些都不是概念C++語言本身涉及的。 – 2012-02-21 01:16:59
@OliCharlesworth - 感謝您的評論。你會用什麼詞來指出我提到的第一個區別? – MByD 2012-02-21 01:19:53
@OliCharlesworth相反,RAII習慣用法是C++設計的一大問題。並且說,freestore不是RII中的R是不靈活的。 – 2012-02-21 01:20:34