软件编程的一些问题

来源:互联网 发布:山东大学java考试题 编辑:程序博客网 时间:2024/05/07 12:35
由于是自己的一些笔记,所以写的比较杂乱,呵呵

    

最近编写软件的时候,多次在程序运行时出现内存不足,Access Violation  After normal block等问题,当在程序最开始运行的时候出现这种问题还好解决,关键是我这个软件是需要多次读取文件数据,因此问题就出来了,最开始读取56个文件还是很理想的,然后连续读取第7个文件的时候,灾难发生了,就出现最开始我说的那些错误,有时候是这个错误,有时候又是那个错误,就前段时间,把我的头都搞大了TMD,查了N次都没有查出来是什么原因。

最开始我还以为是内存泄露的问题,的确,这和内存泄露还是有点相像的,不是吗?Access Violation ,内存不足,种种迹象表明这就是内存的泄露问题,我用下面的代码检查了一下:

#ifdef _DEBUG

              CMemoryState OldMem;

              CMemoryState NewMem;

              CMemoryState DifMem;

 

              OldMem.Checkpoint();

#endif

 

 

#ifdef _DEBUG

              NewMem.Checkpoint();

              if(DifMem.Difference(OldMem,NewMem))

              {

                     AfxMessageBox("Memory Linked!");

              }                         

#endif

   果然是有内存泄露问题的存在,处处出现Memory Linked的对话框,我一阵高兴,因为总算是找到了问题的根源所在啊,就这样,我按着这个指导方向,重新改写了一些函数的不足之处,hoho 经过我的努力,终于使这些代码消除了那个Memory Linked 的对话框,因此,我认为,我的问题已经解决了,呵呵,我兴高采烈的又开始运行我那漏洞百出的小小软件。很显然,当我继续读取文件数据的时候,还是出现了一些问题,实在是让我快崩溃了。后来我实在没有办法了,我以不变应万变,干脆把我那提示错误的类型直接去百度一下,呵呵,

我就直接百度After normal blocks。一看,原来这个错误还是有共性的,搜到了不少有价值的信息。其中有一条是这样的:

这样的错误主要是由内存越界操作导致堆栈被破坏引起的,我有一次申请了x大小的内存,却写入了xy (y>0)的数据,结果导致了这样的错误。由于错误发生的地点与导致错误发生的地点并一定相邻,导致查找错误很困难,对于内存一定要小心再小心。其实大多数莫名其妙的错误都是由内存越界操作引起的

其为CSDN的专栏,网址为:

  http://blog.csdn.net/hbrr224/archive/2006/12/23/1456366.aspx

看了这个描述,我有点豁然开朗的感觉了,很可能就是因为我申请的指针内存不够,导致了内存越界操作。很快我就找到了我那申请内存的指针,于是我开始了我那单步跟踪调试的伎俩,很快,我就发现了,我在申请内存的时候,申请内存数量的那两个变量还没有被初始化,我的天啊,原来在这里,我可算是找到你了,呵呵。

至此,我那小小软件的问题终于得以解决了,还是那句话,对于内存的操作实在是要小心再小心,很多莫名其妙的错误,摸不着头脑的错误,该死的错误,都是这些可爱的内存操作不当所引起的。

最后,程序员,实在是感觉不爽啊,哎~~~~~~~~,调个错误要花好长时间啊,尤其是像我等编码很不规范的来说,这个调试简直就是要命啊。:(

原创粉丝点击