tom*_*afe 6 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]);
Run Code Online (Sandbox Code Playgroud)
我的理解是,最后的包含()
应该将所有元素初始化为零.但是,我注意到了.这是控制台的输出:
buffer[0:3] = [-120][-85][-45][0]
Run Code Online (Sandbox Code Playgroud)
如何使new
初始化程序正常工作?
注意:我知道我可以使用std::fill
,但我很好奇为什么new
初始化程序不能像宣传的那样工作.
编辑:这是我修改后的方法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]);
Run Code Online (Sandbox Code Playgroud)
这输出:
[0][0][0][0]
Run Code Online (Sandbox Code Playgroud)
我的理解是在最后包含()应该将所有元素初始化为零.
你是对的.在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提起的这个错误.我相信那个bug是关于语法的:
new int[x] {};
Run Code Online (Sandbox Code Playgroud)
如果编写可移植代码意味着阅读C++规范,然后根据规范编写具有所需行为的代码,那将是很好的.不幸的是,它通常意味着编写可以解决您关注的所有实现中的错误的代码.
归档时间: |
|
查看次数: |
904 次 |
最近记录: |