【发布时间】:2018-03-26 15:16:58
【问题描述】:
使用 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 数组,代码编译但是当我调试它时它会抛出异常,发出信号堆栈溢出。
减小数组的大小可以解决问题,所以看起来程序没有足够的内存空间来运行。我用谷歌搜索了很多,发现 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):
error MSB6006: "CL.exe" exited with code 2. 1>Done building project
“Fractal.vcxproj”——失败。
========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
【问题讨论】:
-
题外话:我很困惑你为什么使用
unique_ptr<int[]>而不是std::vector<int>(或std::array,因为你的大小可以是编译时间常数) -
您向我们展示的错误行信息最少。请将 full 和 complete 错误消息复制粘贴到问题正文中。
-
已编辑完整的错误消息。我仍然是初学者,我正在学习一门课程,老实说,我使用了独特的指针,因为它们在课程中被使用过。我刚刚尝试使用向量并且它可以工作,而数组抛出此异常:“Fractal.exe 中 0x01393089 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000、0x00482000)。发生”。我现在很困惑,为什么矢量会起作用?
-
因为栈空间有限。默认情况下为 1MB。一个向量在堆上分配底层数组。