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

Sim*_*tti 5 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;
}
Run Code Online (Sandbox Code Playgroud)

问题似乎是分形数组的声明:

unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT]{ 0 });
Run Code Online (Sandbox Code Playgroud)

如果我评论该代码(以及带有分形变量的其他行),则代码编译得很好,如果我将唯一指针更改为普通的 int 数组,则代码会编译,但在调试时会抛出异常,发出堆栈溢出信号。

减小数组的大小可以解决问题,因此看起来程序没有足够的内存空间来运行。我在 google 上搜索了很多,发现 Visual Studio 默认将堆栈大小限制为 1MB(我可能是错的),但我找不到如何在 Visual Studio 2017 中手动增加它。有人可以帮助我吗?

编辑:这是完整的输出:

1>------ 构建开始:项目:Fractal,配置:调试 Win32 ------

1>Main.cpp 1>'C:\Program Files (x86)\Microsoft Visual 中出现内部编译器错误

Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX86\x86\CL.exe'

1> 请在 Visual C++ 上选择技术支持命令 1>

帮助菜单,或打开技术支持帮助文件了解更多信息

信息 1>C:\Program Files (x86)\Microsoft Visual

Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(360,5):

错误 MSB6006:“CL.exe”退出,代码为 2。1> 完成构建项目

“Fractal.vcxproj”——失败。

========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

rus*_*tyx 5

new int[N] { 0 }并不意味着“用零填充数组”,它实际上意味着通过将第一个元素设置为 0 来聚合初始化数组,并对其余元素进行值初始化(将其余元素设置为 0)。例如,如果您编写{ 1 },则会将第一个元素设置为1,但其余元素仍然是0

由于您已经依赖于值初始化,因此您不妨删除0from {0},这也会使您的代码编译:

  std::unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT] {});
Run Code Online (Sandbox Code Playgroud)

至于为什么你的原始代码无法编译 - 这显然是 Visual Studio 2017 中的一个错误。请随意报告它

这是重现该问题的最小应用程序:

int main()
{
  auto test = new int[200000]{1};
  delete[] test;
}
Run Code Online (Sandbox Code Playgroud)