2012-02-29 14 views

回答

9

不,POD類型在由new創建時未被初始化。你可以他們的價值初始化爲零,如果你想:

char * p = new char[100](); 
         ^^ 

這是由標準規定:

C++ 11 5.3.4/15:如果新初始化被忽略,該對象是默認初始化(8.5);如果沒有執行初始化,則該對象具有不確定的值。

8.5/6:向缺省初始化類型T的對象是指:
- 如果T是一個(可能是CV-合格)類型(第9節),T的默認構造函數被調用(和如果T沒有可訪問的默認構造函數,則初始化不合格);
- 如果T是陣列類型,則每個元素是默認初始化;
- 否則,不執行初始化

您的其他觀察:

GCC似乎呼籲每個字符

它不應該做的默認構造函數 - 尤其是char沒有一個構造函數。如果將其替換爲具有默認構造函數的類型,那麼將爲每個元素調用

我得到以下拆卸,沒有任何初始化的跡象:

int main() { 
    char * p = new char[100]; 
    return p[0]; 
} 

00000000004005f4 <main>: 
    # set up stack frame 
    push %rbp 
    mov %rsp,%rbp 
    sub $0x10,%rsp 

    # call `operator new[]` with an argument of 100 
    mov $0x64,%edi 
    callq 4004e0 <operator new[](unsigned long)@plt> 

    # put the return value into %eax 
    mov %rax,-0x8(%rbp) 
    mov -0x8(%rbp),%rax 
    movzbl (%rax),%eax 
    movsbl %al,%eax 

    # return 
    leaveq 
    retq 
+0

+1的^^ :) – vulkanino 2012-02-29 16:27:50

+0

是否有標準的任何地方它明確規定呢? – 2012-02-29 16:31:19

+0

@MichaelGoldshteyn:確實存在;我會在一分鐘內查找它。 – 2012-02-29 16:34:55

相關問題