有时会报错如下:
(1)上述报错的含义:堆溢出。
其错误源代码段如下:
……………………………………………………………………………………(上面还有许多代码)
//如果栈元素总和==n
if (sum(stk) == n) {
//未满,此时也需要回溯(backTrack)
if (stk.size() != 4) {backTrack(p, stk);}
//已满,一个解加入向量,回溯,探寻下一个解
else { pv.push_back(stk); backTrack(p, stk);}
}
}
cout << "n: " << n << " ";
for (std::vector<Stack<Po>>::iterator it = pv.begin(); it != pv.end(); ++it)
{ cout << *it<<" "; }
cout << endl;
}
其显示结果如下:
(1)也就是说,函数运行到末尾都是能正常显示的,即按常理来说,Bug并没有存在于while循环中,不然程序不会跳出循环打印结果。
(2)while循环外的打印段也没有问题。
(3)那么,问题出在哪呢?
经推演后,发现问题出现在如下被调函数中,因其没有设置防火墙:
void backTrack(Po& p, Stack<Po>& stk) {
if (stk.size() < 2) return;//防火墙
stk.pop();
p.base = ++(stk.top()).base;
}
(1)加上防火墙代码后,堆溢出就i没有发生了。
(2)也就是说,就堆溢出而言,Bug可能并不能通过设置调试代码找出,
只能仔细去分析代码细节。