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)