使用Visual Studio 2017构建项目我遇到了这个错误:
错误MSB6006:“CL.exe”退出,代码为2。
这是我的代码:
int main()
{
const int WIDTH=800;
const int HEIGHT=600;
Bitmap bitmap(WIDTH, HEIGHT);
unique_ptr<int[]> histogram(new int[Mandelbrot::MAX_ITERATIONS + 1]{ 0 });
unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT]{ 0 });
//int fractal[WIDTH*HEIGHT]{ 0 };
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
double xFractal = (x - WIDTH / 2 - 200)*2.0 / HEIGHT;
double yFractal = (y - HEIGHT / 2)*2.0 / HEIGHT;
int iterations = Mandelbrot::getIterations(xFractal, yFractal);
if (iterations != Mandelbrot::MAX_ITERATIONS) {
histogram[iterations]++;
}
fractal[y*WIDTH + x] = iterations;
uint8_t color = 256 * (double)iterations / Mandelbrot::MAX_ITERATIONS;
color = color*color*color;
bitmap.setPixels(x, y, color, color, color);
}
}
bitmap.write("Mandelbrot.bmp");
return 0;
}
问题似乎是分形数组的声明:
unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT]{ 0 });
如果我评论(以及分形变量的其他行)代码编译得很好,如果我将唯一指针更改为普通的int数组,代码编译但是当我调试它时会抛出异常,表示堆栈溢出。
减小数组的大小可以解决问题,因此看起来程序没有足够的内存空间来运行。我google了很多,发现视觉工作室通过deafult将堆栈大小限制为1MB(我可能错了),但我无法找到如何在Visual Studio 2017中手动增加它。有人可以帮助我吗?
编辑:这是完整的输出:
1&gt; ------构建开始:项目:分形,配置:调试Win32 ------
1&gt; Main.cpp 1&gt;'C:\ Program Files(x86)\ Microsoft Visual
中的内部编译器错误演播室\ 2017 \社区\ VC \工具\ MSVC \ 14.11.25503 \ BIN \ HostX86 \ 86 \ CL.EXE'
1&GT;请在Visual C ++ 1&gt;
上选择技术支持命令“帮助”菜单,或打开技术支持帮助文件以获取更多信息
信息1&gt; C:\ Program Files(x86)\ Microsoft Visual
演播室\ 2017 \社区\ Common7 \ IDE \ VC \ VCTargets \ Microsoft.CppCommon.targets(360,5):
错误MSB6006:“CL.exe”退出代码2. 1&gt;完成构建项目
“Fractal.vcxproj” - 失败。
==========构建:0成功,1失败,0最新,0跳过==========
答案 0 :(得分:4)
new int[N] { 0 }
并不意味着“用零填充数组”,它实际上意味着通过将第一个元素设置为0来聚合初始化数组,并对值进行初始化休息(将其余部分设为0)。例如,如果您编写{ 1 }
,则会将第一个元素设置为1
,但其余元素仍为0
。
由于您已经依赖于值初始化,因此您也可以从0
中删除{0}
,这也会使代码编译:
std::unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT] {});
至于为什么原始代码无法编译 - 这显然是Visual Studio 2017中的一个错误。请随意report it。
这是重现问题的最小应用程序:
int main()
{
auto test = new int[200000]{1};
delete[] test;
}