Visual Studio 2017 - 错误MSB6006:“CL.exe”已退出,代码为2

时间:2017-10-14 17:54:46

标签: c++ visual-studio-2017

使用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跳过==========

1 个答案:

答案 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;
}