C++ MSVC2013和新的阵列支架初始化问题

C++ MSVC2013和新的阵列支架初始化问题,c++,visual-studio-2013,C++,Visual Studio 2013,我一直在看这个小片段: #include <iostream> #include <cstring> int main() { char const *a = "my string"; size_t len = strlen(a); char *b = new char[len + 1]{0}; char *zeroes = new char[strlen(a) + 1]; memset(zeroes, 0, strlen(a)

我一直在看这个小片段:

#include <iostream>
#include <cstring>

int main()
{
    char const *a = "my string";
    size_t len = strlen(a);
    char *b = new char[len + 1]{0};

    char *zeroes = new char[strlen(a) + 1];
    memset(zeroes, 0, strlen(a) + 1);

    std::cout << memcmp(b, zeroes, strlen(a) + 1); // 0 expected
}

这是MS VC++编译器的一个错误。根据C++标准(5.3.4新)

17创建类型为T的对象的新表达式初始化该对象,如下所示:

-如果省略了新的初始值设定项,则对象默认已初始化(8.5);如果未执行初始化,则对象的值不确定

-否则,新的初始值设定项将根据directinitialization的8.5初始化规则进行解释

以及其他(8.5.1骨料)

7如果列表中的初始值设定项子句少于集合中的成员,则未明确初始化的每个成员应使用大括号或相等初始值设定项进行初始化,如果没有大括号或相等初始值设定项,则应使用空初始值设定项列表(8.5.4)进行初始化

和(8.5.4列表初始化)

-否则,如果初始值设定项列表中没有元素,则对象的值已初始化

最后(8.5个初始化者)

8值初始化类型为T的对象意味着

-如果T是数组类型,则每个元素都初始化为值; -否则,对象初始化为零


所以数组的所有元素都应该是零初始化的。

您是否在gdb中转储了数组等?我在MSVC中转储了,我正在附加内存转储您是否尝试过不使用
0
,即
新字符[len+1]{?我的意思是,它仍然应该用一个零把所有的东西都归零,但看到@user657267能够正常工作并正确输出会很有趣0@HansPassantC++11语法已经有大括号或相等的初始值设定项语法。
int main()
{
000007F676571270  push        rbx  
000007F676571272  sub         rsp,20h  
    char const *a = "my string";
    size_t len = strlen(a);
    char *b = new char[len + 1]{0};
000007F676571276  mov         ecx,0Ah  
000007F67657127B  call        operator new[] (07F676571704h)  
000007F676571280  mov         rbx,rax  
000007F676571283  test        rax,rax  
000007F676571286  je          main+1Dh (07F67657128Dh)  
000007F676571288  mov         byte ptr [rax],0  // zero the first one out
000007F67657128B  jmp         main+1Fh (07F67657128Fh)  
000007F67657128D  xor         ebx,ebx  

    char *zeroes = new char[strlen(a) + 1];
000007F67657128F  mov         ecx,0Ah  
000007F676571294  call        operator new[] (07F676571704h)