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[]也会造成堆回收的错误。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值