再记录一次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算法包括迭代器等基本措施没去了解实现的话这时候会很不知所措的。

时间: 09-08

再记录一次delete出错的经历的相关文章

写一些东西记录技术上的想法和经历

在quora上面有人问程序写太多了是一种什么体验? 然后有人举了一个例子: 有个哥们遇到难题,找啊找终于在stackoverflow上面找到了答案,答案完美的解决了问题.这哥们对答主的才华很是佩服,于是看看答主是谁,但瞬间惊呆了..........原来答主就是他自己. 这个事情告诉我们,做技术的天天要经历许多事情和问题,累积的太多就没有办法有效的review之前做过的东西.技术人员很多都爱写博客,一方面是方便交流,另一方面对自己也是个记录.因此,以后要写点博客记录值得记下来的东西.

记录2015年年初跳槽的经历!

引言 LZ在某大型P2P公司已经做了两年半之久,考虑到未来的职业和行业发展,LZ深思熟虑之后,决定开启人生的第二次跳槽. 第一次跳槽LZ的想法比较单纯,就是希望能够找一家比较大的公司,能够有很好的升职空间.结果LZ如愿以偿,找到了一家P2P行业的巨头公司,并且也如愿在一年半的时间内升职为SM兼PM.自我感觉,这一次跳槽还算是比较成功,没有给LZ留下什么遗憾. 这一次跳槽LZ的想法其实依然比较单纯,就是希望将自己的金融行业背景,更换为互联网金融行业,加上互联网的标签.于是LZ与各大互联网公司的大战

[python]记录Windows下安装matplot的经历

最近学习在看<机器学习实战>一书,第二章的时候要用到Natplotlib画图,于是便开始安装Matplotlib.本文所用到的所有安装包都可以在文末的链接中找到. 首先从Matplotlib官网提供的链接下载安装包http://matplotlib.org/downloads.html,选择适合自己python的版本,笔者用的是python2.7,所以下载了matplotlib-1.4.2.win32-py2.7.exe,如下图所示. 下载完成之后点击安装,打开python shell输入im

再记录一下如何配置oracle instantclient

这问题遇到很多次,每次重装系统就遇到一次,却总是搞半天才搞定. 今天再次花费几个小时解决,终于有一个清晰的认识必须记录一下. 一.下载解压,不建任何目录,直接复制tnsname.ora过来.(当然也可以建network/admin, 后面配置写对就行 二.配置pl/sql 1.添加环境变量Path加入解压目录, 2.添加TNS_ADMIN"="D:\\fox\\instantclient"             "NLS_LANG"="AMER

SQL DELETE 语句:删除表中的记录语法及案例剖析

SQL DELETE 语句 DELETE 语句用于删除表中的记录. SQL DELETE 语句 DELETE 语句用于删除表中的行. SQL DELETE 语法 DELETE FROM table_name WHERE some_column=some_value; 请注意 SQL DELETE 语句中的 WHERE 子句! WHERE 子句规定哪条记录或者哪些记录需要删除.如果您省略了 WHERE 子句,所有的记录都将被删除! 演示数据库 在本教程中,我们将使用 样本数据库. 下面是选自 "W

(笔记)Mysql命令delete from:删除记录

delete from命令用于删除表中的数据. delete from命令格式:delete from 表名 where 表达式 例如,删除表 MyClass中编号为1 的记录:    mysql> delete from MyClass where id=1; 请对比一下删除数据前后表的变化. FirstName LastName Age Peter Griffin 35 Glenn Quagmire 33 下面以PHP代码为例删除 "Persons" 表中所有 LastNam

ABAP面试经历【转http://blog.csdn.net/tsj19881202/article/details/8792742】

本周三面试了一次HP的globe部门,整个过程自己感觉特别糟糕.总结了一下经验, 1.不能把自己平时做的东西,很好的用语言描述出来 2.技术点其实都会,但是不了解对方问题的意思,所以没能很好的回答对方的问题.比如问对方dialog有几个事件,我只记得有pai,pbo.其实f1和f4事件也是.但是我没有意识到.诸如此类的问题有很多. 3. 简历上一定要真实的经验.比如我简历上写了逻辑数据库知识,但是这个跟我理解的是有差别的. 以下是我面试的一些题目.只做参考 开始,就是英文的自我介绍,大致讲一下自

MySQL数据库ab主从复制出错及解决过程

MySQL数据库ab主从复制出错及解决过程 一.mysql主从服务器报错描述:Slave_IO_Running=NO,Slave_SQL_Running=YES,Last_Errno=0 mysql slave stop ; mysql slave start; mysql show slave status ; 如果Slave_IO_Running=YES ...解决过程 :1 如果:Slave_IO_Running=NO,Slave_SQL_Running=YES,Last_Errno=0m

Neural networks学习——记录python3下与教材里的python2的不同

在经历了投了多次简历都石沉大海之后,决定继续充电充实自己OTL,于是开始学习神经网络这一块. 找到了深度学习的经典教材.在线网址:http://neuralnetworksanddeeplearning.com 但是这里用的是python2.7,而我自己学的是python3,所以部分代码不能直接搬用,先放上python3和python2有哪些不同. 然后再记录下在学习的过程中,需要改变的内容: 章节一(手写数字的辨认): 1.pickle的改变 这里需要把MNIST里的src文件夹下的mnist