首页 > 代码库 > 再记录一次delete出错的经历

再记录一次delete出错的经历

调试的时候进行到delete语句时出现问题,我做的操作是在函数体内用int*申请了N个内存空间,这让我十分纳闷,为什么不能delete呢?

 

回忆到之前delete出错也遇过一次问题

手动封装OpenCV1.0的IplImage读取保存功能遇到的小问题

原因是申请内存并不是通过new操作,而是自带的函数(cvLoadImage),所以需要自带的函数(cvReleaseImage)来释放内存。

典型的错误信息:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

而这次错误信息不一样

技术分享

 

HEAP CORRUPTION DETECTED

搜一下就能看到很多解决方案,即使是复制粘贴的也还算靠谱。不过这里提示比之前明显了:

第一句:检测到HEAP(堆)的破坏:在普通块(#14),地址是0xx003CC0E0;

第二句:CRT检测到应用程序在堆缓存的结尾之后进行写入操作。

第二句是最直白的,但是写代码看细心,调试得看眼力。注释掉跟写入无关的操作后定位到一句,乍看之下没问题,仔细一看……

我对申请内存空间的int*进行了memcpy操作,由于我写的是函数模板,所以自然地写上了sizeof(T)而不是sizeof(int),幸好我这是验证某个排序是不是稳定排序的程序,而不是直接的小测试,如果sizeof(T)也是4的话,也就不会报错了,当然,这也会导致错误检查不出来。

 

PS:主要原因还是现在也有点晚了,没有集中注意力,错误难免,而使用C风格指针管理内存确实需要注意。

说到这里,其实C++风格也好不到哪里去,上次对std::set进行set_union操作时一直出错,而且由于STL算法都是函数模板,错误信息几十行,如果是刚入门的绝对被吓哭。最后发现set_union算法是默认写入对象预留了足够多空间,而std::set不能初始化大小,所以需要用插入迭代器insert_iterator(把迭代器作为参数传入inserter函数即可)。

对STL算法包括迭代器等基本措施没去了解实现的话这时候会很不知所措的。

再记录一次delete出错的经历