我一直在看這個小片段:MSVC2013和新的數組括號初始化問題
#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
}
gcc和clang正確輸出0
但MSVC2013更新3個輸出1
。
我讀5.3.4/17
關於new
和新初始化但找不到任何理由MSVC的行爲。
我錯過了什麼嗎?這是一個已知的問題?
編輯:我附加從MSVC存儲器轉儲和生成的彙編代碼(64釋放)
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)
你把數組轉儲到gdb等了嗎? – user657267 2014-10-17 08:46:06
我在MSVC中做過,我附加了內存轉儲 – 2014-10-17 08:46:32
您是否嘗試過沒有'0',即'new char [len + 1] {};'?我的意思是它應該仍然用零來消除所有的東西,但是看到它會很有趣。 – user657267 2014-10-17 08:54:30