新字符数组不会初始化为全零

时间:2014-02-13 22:54:21

标签: c++ memory-management

我正在尝试为可变长度n的字符串分配内存。这是我的尝试:

int n = 4; // Realistically, this number varies.
char* buffer = new char[n * 512]();
printf("buffer[0:3] = [%d][%d][%d][%d]\n", buffer[0], buffer[1], buffer[2], buffer[3]);

我的理解是,最后包含()应该将所有元素初始化为零。但是,我注意到了。以下是控制台的输出:

buffer[0:3] = [-120][-85][-45][0]

如何使new初始化程序正常工作?

注意:我知道我可以使用std::fill,但我很好奇为什么new初始化程序不起作用as advertised

编辑:这是我使用std::fill修改后的方法,它提供了正确的行为。但我仍然想知道为什么这是必要的。

int n = 4; // Realistically, this number varies.
char* buffer = new char[n * 512]();
std::fill(&buffer[0], &buffer[n * 512], 0)
printf("buffer[0:3] = [%d][%d][%d][%d]\n", buffer[0], buffer[1], buffer[2], buffer[3]);

输出:

[0][0][0][0]

1 个答案:

答案 0 :(得分:8)

  

我的理解是在末尾包含()应该将所有元素初始化为零。

你是对的。在C ++ 98,C ++ 03和C ++ 11中(所有使用措辞略有不同),空括号表示new ed数组将被初始化,以便char元素将最终归零。

  

c ++(GCC)3.4.6 20060404(Red Hat 3.4.6-11)。我传递的标志是:-m32 -fPIC -O2

gcc 3.4现在已经有近十年的历史了,这个bug就不足为奇了。事实上,我认为我模糊地回忆起在过去四五年中某个时候对gcc提起的这个错误。我相信这个错误是关于语法:

new int[x] {};

如果编写可移植代码意味着阅读C ++规范,然后根据规范编写具有所需行为的代码,那将是很好的。不幸的是,它通常意味着编写代码,以解决您关心的所有实现中的错误。