此问题在此处已有答案:
Segmentation fault on large array sizes(7个答案)
10天前关门了。
我在MVC++ 2010中用c++写了一段代码。在里面,程序迭代了一个一维指针数组的元素(双 *)。然而,当我把输入(指针数组的大小)设置得很大,例如15000,并运行程序时,它停止工作并显示一个窗口关闭程序,因为它没有响应!这是什么问题?
下面是构建数组的部分代码:
map<int, double *> CF;
CoefficientMap(CF);
double *T = new double[I * J];
for (int r = 1; r <= I * J; ++r)
T[r] = 100;
SOR(T, CF, 1.8);
字符串
下面是迭代器函数:
void SOR(double *T, map<int, double *> &CF, double w)
{
int iter = 0;
cout << "Stage 2: Solving the linear system of equations using SOR method... ";
const double tol = 0.00001;
double error = tol + 1;
double *TOld = new double[I * J];
for (int i = 1; i <= I * J; ++i)
TOld[i] = 100;
while (abs(error) > tol)
{
++iter;
for (int i = 1; i <= I * J; ++i)
T[i] = (CF[i][0] + CF[i][1] * T[i + 1] + CF[i][2] * T[i + J] + CF[i][3] * T[i - J] + CF[i][4] * T[i - 1]) * w + (1 - w) * T[i];
error = errorCalc(TOld, T, I * J);
for (int i = 1; i <= I * J; ++i)
TOld[i] = T[i];
if (iter % 100 == 0)
{
cout << endl << endl;
cout << "100 iterations done, please wait..." << endl << "Total accumulative error till this point: " << error << endl;
}
if (iter > 10000)
return;
}
cout << "Done!" << endl << endl;
cout << "Converged after " << iter << " iterations!" << endl;
cout << "Final accumulative error: " << error << endl << endl;
}
型
现在,当(I * J)变得足够大(例如15000)时,程序停止工作!
3条答案
按热度按时间a7qyws3x1#
最可能的解释是,你用完了堆栈空间。简单的解决方法是让数组静态或全局。你也可以从堆中分配
new
。两者都将数组移出堆栈。最好的可能是使用智能指针并将其放入堆:
字符串
当智能指针变量超出作用域时,这将负责释放内存,无需手动删除。
为了更好的回答,编辑问题以包含代码...
你添加的代码至少在数组索引方面有问题。索引从0开始,然后转到数组大小减一。正确的循环:
型
你在其他循环中也有同样的错误,同样的修复。
替代修复:如果你想从1开始索引(比如,因为你有这样写的伪代码算法,不想改变索引),最简单的是分配一个更大的数组,而不是使用索引0:
型
这样你就可以使用当前的循环了。
这种一个数组元素的缓冲区溢出是很讨厌的,因为通常在分配的内存块的末尾可能有未使用的空间,所以bug可能会完全被忽略,直到你改变数组大小和未使用的空间消失。即使溢出导致堆损坏,它也可能会被忽略,直到你改变代码和损坏的影响改变。所以例如,如果你不走运,添加调试代码可能会隐藏问题。
svujldwt2#
这听起来像是在堆栈上分配一个普通数组,像这样:
字符串
堆栈的大小是有限的-您应该使用
new
或(更好)使用std::vector
分配。qpgpyjmq3#
您在堆栈上分配了太多的空间,因此没有足够的内存来满足您的请求。作为替代方案,您可以给予对象静态存储期限,或者您可以使用
new
将其放在空闲存储区中:字符串