2009-08-11 23 views
5

查看一些示例代碼,並遇到一些零大小的數組分配。我創建了下面的代碼片段,以澄清我的問題零大小的數組分配是幹什麼的?

這是合法的代碼:

class T 
{ 
}; 

int main(void) 
{ 
    T * ptr = new T[0]; 

    return 0; 
} 

它的用途是什麼? ptr有效嗎?這個構造是否便攜?

回答

8

在C++標準5.3.4:在直接新聲明符

6每常數表達式應整數表達式(5.19),並計算爲嚴格正值。所述表達直接新聲明符應具有與非負值整數或枚舉類型(3.9.1)...

7當表達的在直接的值新聲明者爲零,調用分配函數來分配沒有元素的數組。

所以,你的代碼分配一個數組,其行爲在任何方面都像T的任何其他數組(可以使用delete []刪除,作爲參數傳遞,可能還有其他東西)。但是,它沒有可訪問的索引(即,讀取或寫入ptr [0]導致未定義的行爲)。

在此上下文中,常量表達式和表達式之間的差異不在於實際表達式是否爲編譯時間常量(顯然爲0),而是指定多維數組的「最後」維度。語法在5.3.4:1中定義。

0

是的,它是有效的行爲,ptr將是有效的。該構造對於遵循C++標準的所有C++編譯器是可移植的。這是有用的,因爲它允許您編寫不需要特殊情況stuiff的代碼來處理元素數量爲零的情況。

但是,與往常一樣,通過使用std :: vector(也可以是零大小)而不是數組可以更好地服務。

2

它被授權(5.3.4/6)。其結果是一個空數組,所以返回的值是指向數組的指針。

0

一個相關的問題是:What should malloc(0) return?

And from some C99 docs,malloc的(0)的行爲是實現定義:

是否釋放calloc,malloc和 realloc函數返回一個空 指針或當請求的大小爲零時指向分配的 對象 (7.20.3)。

返回空指針或可傳遞給free() 的唯一 指針。

請參閱malloc(3C)手冊頁。

當然你問的是C++,但是malloc信息無論如何都可能是有用的。

+1

C++新定義良好。 – AProgrammer 2009-08-11 11:47:02

相關問題