2013-06-01 24 views
7

我有一個問題。C++ new * char不爲空

我在ASIO中開發服務器,數據包在尖括號中。

當我創建新的字符(例如char * buffer = new char[128];)我必須手動清理它爲空。

通過:

for(int i =0;i<128;i++) 
{ 
buffer[i] = 0x00; 
} 

我做錯了什麼,那char是不明確?

+0

你的問題已經回答了[類型名稱後的圓括號與新的區別?](http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name -make-A-差與新)。 – Troubadour

回答

19

您不必遍歷未初始化值的數組。您可以動態地實例零的數組是這樣的:

char * buffer = new char[128](); // all elements set to 0 
          ^^ 
3

分配的內存不會清除,它將包含隨機的東西。這就是內存分配的工作原理。您必須運行for -loop或使用memset手動清除它。

-5

因爲它是一個指針,必須那樣做:

for(int i = 0; i < 128; i++) 
{ 
(buffer + i) = 0x00; 
} 
+1

-1:代碼是錯誤的(賦值0x00給右值),並且建議是錯誤的(OP的代碼確實編譯,你沒有)。 – milleniumbug

+0

1.你忘記解除LHS的引用,所以你試圖分配給r值(你的代碼不會編譯)。 2'buffer [i]'是通過與'*(buffer + i)'相同的語言標準。雖然在這種情況下數組和指針*不同於每種語言標準,它們在某種程度上是可以互換的。 –

11

有兩種類型的調用C++的new操作符的方式 - 默認初始化,初始化爲零。

爲默認INITIALISE(這將離開值undefined)電話:

int * i = new int; 

它是那麼不確定behavoir閱讀或直至它被設置使用此值。

要zeroinitialise(這將設置爲0)使用方法:

int * i = new int(); 

這也適用於數組:

int * i = new int[4]; // ints are not initialised, you must write to them before reading them 
int * i = new int[4](); // ints all zero initialised 

還有更多的一些信息here

2

您還可以使用calloc。它將每個元素初始化爲0。 例如:

char* buffer = (char *) calloc (128, sizeof (char)) 

第一個參數是要分配的塊的數量。其次是塊的大小。 此函數返回void *,因此您必須將其值轉換爲(char *) 如果您使用calloc(或malloc或任何「純c」分配函數),則最好使用free函數來取消分配內存而不是刪除內存。