This may be due to a corruption of the heap!

尝写通信协议,经常用到数组。BOSS教导说,有new必有delete,牢记之。于是报错,VS云"This may be due to a corruption of the heap"。可喜(?)的是,错误还有不同的来源。

第一次报错就查了很久。C设计的一个问题是,用户必须自己记住所有的new并将其一一delete。在使用函数开新数组的情况下,很容易造成忘记delete或者重复delete的状况。前者无非(?)就是资源泄漏,后者就会造成编译器报错。引申而来的问题就是,究竟在何处delete掉数组指针?

项目里有函数getBytes指向新建数组,又设计一个函数SendMscommMessage(BYTE* psz, int len)传送串口数据,代码如下:

CByteArray array; 
array.RemoveAll();					
array.SetSize(len);					 
for(int i = 0; i < len; i ++)        
	array.SetAt(i, psz[i]); 
m_ctrlMscomm.put_Output(COleVariant(array)); 
delete []psz;


而在使用完函数之后,我不小心忘记里面已经做过delete,而兴高采烈地牢记new-delete法则

SendMscommMessage( pCM->getBytes(), pCM->getMessageLength() );
BYTE* pOldsz = pCM->getBytes();
delete []pOldsz;

说到底,这是一个习惯问题。设计者必须使用同一套规则,或者将delete封装于函数之内,或者完全手动删除new指针。

处理完重复delete,相同的报错信息依然存在,只不过换了一个函数。曾以为是不知何处又多删除,翻来覆去查了两遍却毫无所获。大恼之下,突然想到数组大小问题,果然如是。在新建数组大小不正确的情况下访问内存,然后delete[]也会造成堆回收的错误。

你可能感兴趣的:(MFC)