《数据结构、算法与应用 c++语言实现--SS》一书中堆的代码实现的bug

问题的发现

我在敲这本书中关于堆的代码的时候,发现完全按照书中代码敲完之后,编译成功,运行结果也正确,但是程序并没有正常结束,而是在最后一行return 0的时候崩溃了,经过一步步的debug,首先确定问题出现在析构函数当中,即delete []heap,一句出现了问题,而且问题的根源在于

ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))

但是debug了好多遍也没找到任何毛病,当再次看代码的时候,才发现了问题所在。

问题的解决

再次看代码的时候,发现initialize(T *theHeap,int theSize) 函数的第一句就是delete []heap 然后把theHeap赋值给heap,这时我就想到关键字delete 是必须和关键字 new 相互对应的,那么问题可能就是出在了这里;果不其然,由于在main方法里,数组theHeap不是动态定义的,而是int theHeap[10] 的形式,静态定义的,构造函数里动态定义出来的数组heap已经不存在了,而是被静态定义的theHeap取代了,这时本来在析构函数里和构造函数中的new 对应的delete关键字就会发生BLOCK_TYPE_IS_VALID 的错误。所以在initialize(T *theHeap,int theSize) 函数中,不能删除heap,而是应该用一个循环,把theHeap中的内容复制到heap中,这样才不会破坏构造函数和析构函数中new和delete的对应。

总结

通过这次经验,明白c++中用new和delete两个关键字的时候一定要慎重。按照书中的代码,initialize函数的参数必须是动态定义的数组,否则就会出现问题,这样的只支持动态定义的数组的函数肯定是有bug的,而且这本书的网站中给的代码其main方法中initialize函数的参数是静态定义的数组,这肯定是错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值