2011-11-30 64 views
1
int buf1[] = {0,0,0,0,0}; 

int* buf2 = new int[5]; //assume every element is initialzed to 0 as well 

我能想到的唯一區別是buf1是對數組的引用,而buf2是指向數組的指針。換句話說,buf1總是指向數組,而buf2也可以指向其他地方。比較兩種聲明數組的方法

除了上面提到的,聲明(和初始化數組)的兩種方式之間還有其他區別嗎?

+5

你爲什麼假設每個元素都在'new'情況下初始化? –

+0

@FredLarson我只是省略了初始化步驟,以節省一些空間。 –

+1

雖然它專門用於C,但這可能有一些用處:http://c-faq.com/aryptr/index.html – Polynomial

回答

9

buf1是一個自動對象(或靜態,如果它在全局範圍內); *buf2是一個動態對象。也就是說,buf1的使用期限是自動控制的,而*buf2的使用期限是您自己管理的。 (buf2直到您說出類似delete[] buf2;的內容)。

初始化程序也不同; buf1被大括號初始化,而*buf2被默認初始化(即,其int元素未被初始化)。

+2

+1:事實上'buf1'是自動的,而'buf2'是動態的,這是迄今爲止最重要的區別。 –

1

如果聲明int buf1 [] = {0,0,0,0,0};在函數退出後,數組將被銷燬。在第二種情況下,在完成像使用delete [] buf2一樣的使用後,您必須手動刪除數組,但這種方式不會自動銷燬,因此您可以在任何地方使用它,直到刪除它爲止。

1

除了你必須清理(刪除)你的第二個版本?而第一個和第二個版本將分配在RAM的不同區域?如果這些0被存儲而不是生成,第一個可能會佔用更多的可執行空間?或者第二個版本甚至會將RAM清除爲0,我不相信它。

他們是非常不同的。

3

在第一種情況:

  • 自動(在功能範圍內)或靜態的(在命名空間範圍)分配用於
  • 已初始化的值,以全零

在第二種情況:

  • 動態分配被使用(並且您將必須在delete []之後)
  • 該陣列未初始化
2
int buf1[] = {0,0,0,0,0}; 

這給出自動存儲,如果它是在一個塊中,或靜態存儲,如果它在一個命名空間。在第一種情況下,它會一直持續到程序離開它在內部聲明的程序塊;第二,它持續到程序退出。

int* buf2 = new int[5]; 

這將動態創建數組;您可以控制其使用期限,並持續到刪除它(delete [] buf2)。如果你不刪除它,那麼就有內存泄漏,這是你應該避免的。爲了確保動態對象被正確刪除,最好不要直接用原始指針來管理它們,而應該使用智能指針或容器等類來爲你管理它。

+0

嚴格地說,是否存在內存泄漏取決於您對':: operator new()的實現(例如,它可以從池中進行分配,以便正確清理)。你總是有一個「終身泄漏」。 –