堆溢出:Bug没有存在于调试代码处,而是在别处

有时会报错如下:
在这里插入图片描述
(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可能并不能通过设置调试代码找出,
只能仔细去分析代码细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值