Visual Studio 2017 - 错误代码MSB6006:"CL.exe"以2的代码退出

5

在使用Visual Studio 2017构建项目时,我遇到了这个错误:

error 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 });

如果我注释掉那行代码(以及其他使用fractal变量的代码),程序就可以编译通过。如果我将unique pointer更改为普通的int数组,则代码可以编译,但调试时会抛出异常,表示栈溢出。

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

编辑:以下是完整输出:

1>------ 开始生成: 项目: Fractal, 配置: Debug 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'

中的 INTERNAL COMPILER ERROR

1> 请在 Visual C++ 帮助菜单上选择“技术支持”命令或打开技术支持帮助文件以获取更多信息

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 个 ==========


1
离题:我不明白为什么你要使用 unique_ptr<int[]> 而不是 std::vector<int>(或者 std::array,因为你的大小可以在编译时确定)。 - UnholySheep
3
你展示给我们的错误行是最不具信息性的。请将完整详细的错误信息复制粘贴到问题描述中。 - Some programmer dude
1
编辑后附上完整的错误信息。我还是个初学者,正在跟着一门课程学习。老实说,我用unique pointers只是因为它们在这门课程中被使用了。现在我刚试了试vector并且成功了,但是使用数组时会抛出以下异常: "Unhandled exception at 0x01393089 in Fractal.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00482000). occurred"。我很困惑,为什么vector会有效? - Simone Giulietti
由于栈空间有限,默认情况下为1MB。向量在堆上分配底层数组。 - rustyx
1个回答

5

new int[N] { 0 } 并不是意味着"用零填充数组",它实际上的意思是聚合初始化数组,将第一个元素设置为0,其余值初始化(设置为0)。例如,如果你写了{1},那么会将第一个元素设置为1,但其余元素仍将被设置为0

既然您已经依赖于值初始化,那么最好从{0}中删除0,这也使您的代码编译:

  std::unique_ptr<int[]> fractal(new int[WIDTH*HEIGHT] {});

关于为什么您的原始代码无法编译 - 这显然是Visual Studio 2017中的一个错误。请随意报告它
这里是一个最小的应用程序来重现这个问题:
int main()
{
  auto test = new int[200000]{1};
  delete[] test;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接