2014-01-28 40 views
4
int* array = new int[ 10 ](); 

這是新操作符的正確用法嗎?據我所知,以前的代碼將在陣列中的每個元素初始化爲0。C++適當的新用法?

int* array = new int[ 10 ]; 

是否代碼的第二行只是初始化數組,而不是設置的值爲零?

+1

第二個將執行默認初始化,這對於數組被定義爲成員的默認初始化。默認初始化一個'int'是一個no-op。 – dyp

+2

沒有「正確的」用法。這一切都取決於你的需求。這就是爲什麼有不同的選擇。是的,第一個零初始化元素,第二個沒有。 – juanchopanza

+1

如果你想要零,請使用第一個。如果你不這樣做,請使用第二個。 – Maroun

回答

2

使用新運算符的正確方法取決於分配內存後要執行的任何操作。

int* array = new int[10]();將清零您正在分配的內存,因爲它正在爲陣列中的每個int運行int初始化器。

int* array = new int[10];不會初始化內存,所以每個值的數組中詮釋將是無論值在您new得到的內存地址。如果你幸運的話,它可能是零,但很可能它可能是其他內存請求/釋放留下的垃圾。

一般來說,您需要將未初始化的變量視爲垃圾值,並在爲它們分配值之前不使用它們。除非你在隨機數發生器中將它用作熵,但即使如此,如果內存太乾淨,它可能不夠隨機。另一個罕見的用例可能是窺探另一個程序在關閉後留在內存中的內容。這兩個例子都是規則的例外。

通常最初不初始化的原因是速度。將數組中的每個項目設置爲0都會加速其成本,儘管它可能很小,但如果數組很大或者您經常執行此代碼,則可能會引起注意。這是爲當你知道你將使用它們之前設置這些值,你可以節省自己不必要的初始化成本。

現在已經說了所有這些,我同意std::vector<int>通常是更好的選擇,如果沒有其他優點,您不必擔心內存泄漏(這可能會花費很多的調試/開發時間,不應該被低估),並且你也獲得了很多好處。更不用說你可以用向量來完成所有與常規數組相同的事情 - 這是因爲向量分配連續的內存。

std::vector<int> safeArray(10); 
int* array = &safeArray[0]; // array now points to the 0th element in safeArray 

你失去了std :: vector的一件事就是你不再有選擇是否你初始化。