问题的发现
我在敲这本书中关于堆的代码的时候,发现完全按照书中代码敲完之后,编译成功,运行结果也正确,但是程序并没有正常结束,而是在最后一行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函数的参数是静态定义的数组,这肯定是错的。