【问题标题】:New character array won't initialize to all zeros新字符数组不会初始化为全零
【发布时间】:2014-03-13 02:30:06
【问题描述】:

我正在尝试为可变长度的字符串分配内存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]

【问题讨论】:

  • 哪个编译器?这很容易导致观察到的行为。
  • 嗯,它似乎可以按预期与 gcc 一起工作:codepad.org/X0F5bAk6
  • 我的编译器是c++ (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)。我通过的标志是:-m32 -fPIC -O2.
  • 你是在构建一个普通的可执行文件,还是这个代码在库中?
  • 对了,为什么不用std::array?

标签: c++ memory-management


【解决方案1】:

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

你是对的。在 C++98、C++03 和 C++11(都在措辞上略有不同)中,空括号表示 newed 数组将被初始化,因此 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++ 规范,然后根据规范编写具有所需行为的代码,那就太好了。不幸的是,这通常意味着编写代码来解决您关心的所有实现中的错误。

【讨论】:

  • 哈……这个数字。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2015-07-28
相关资源
最近更新 更多