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也可以指向其他地方。比較兩種聲明數組的方法
除了上面提到的,聲明(和初始化數組)的兩種方式之間還有其他區別嗎?
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也可以指向其他地方。比較兩種聲明數組的方法
除了上面提到的,聲明(和初始化數組)的兩種方式之間還有其他區別嗎?
buf1
是一個自動對象(或靜態,如果它在全局範圍內); *buf2
是一個動態對象。也就是說,buf1
的使用期限是自動控制的,而*buf2
的使用期限是您自己管理的。 (buf2
直到您說出類似delete[] buf2;
的內容)。
初始化程序也不同; buf1
被大括號初始化,而*buf2
被默認初始化(即,其int
元素未被初始化)。
+1:事實上'buf1'是自動的,而'buf2'是動態的,這是迄今爲止最重要的區別。 –
如果聲明int buf1 [] = {0,0,0,0,0};在函數退出後,數組將被銷燬。在第二種情況下,在完成像使用delete [] buf2一樣的使用後,您必須手動刪除數組,但這種方式不會自動銷燬,因此您可以在任何地方使用它,直到刪除它爲止。
除了你必須清理(刪除)你的第二個版本?而第一個和第二個版本將分配在RAM的不同區域?如果這些0被存儲而不是生成,第一個可能會佔用更多的可執行空間?或者第二個版本甚至會將RAM清除爲0,我不相信它。
他們是非常不同的。
在第一種情況:
在第二種情況:
delete []
之後)int buf1[] = {0,0,0,0,0};
這給出自動存儲,如果它是在一個塊中,或靜態存儲,如果它在一個命名空間。在第一種情況下,它會一直持續到程序離開它在內部聲明的程序塊;第二,它持續到程序退出。
int* buf2 = new int[5];
這將動態創建數組;您可以控制其使用期限,並持續到刪除它(delete [] buf2
)。如果你不刪除它,那麼就有內存泄漏,這是你應該避免的。爲了確保動態對象被正確刪除,最好不要直接用原始指針來管理它們,而應該使用智能指針或容器等類來爲你管理它。
嚴格地說,是否存在內存泄漏取決於您對':: operator new()的實現(例如,它可以從池中進行分配,以便正確清理)。你總是有一個「終身泄漏」。 –
你爲什麼假設每個元素都在'new'情況下初始化? –
@FredLarson我只是省略了初始化步驟,以節省一些空間。 –
雖然它專門用於C,但這可能有一些用處:http://c-faq.com/aryptr/index.html – Polynomial