易码技术论坛

 找回密码
 加入易码
搜索
查看: 424528|回复: 11

问题........奇怪的错误[C++]

[复制链接]
发表于 2006-8-23 18:31:58 | 显示全部楼层
错误出在动态分配内存上,很奇怪 这里跟new和delete有关的东东都没有出错...
发表于 2006-8-23 19:21:58 | 显示全部楼层
越后界了,比如申请的空间为N,实际操作了超过N的范围
 楼主| 发表于 2006-8-23 21:09:48 | 显示全部楼层
可以仔细点说么?
我有点不明白啊 谢谢呢!
 楼主| 发表于 2006-8-23 21:11:20 | 显示全部楼层
这里不应该超啊..原本的就是只能比原来的少 不可能多的呢...
 楼主| 发表于 2006-8-23 21:11:47 | 显示全部楼层
啊 知道了...我后加的一个/n 可能在这里有错误....
 楼主| 发表于 2006-8-23 21:40:02 | 显示全部楼层
HEAP CORRUPTION DETECTED: after Normal block (#93) at 0x008E3EA0.
CRT detected that the application wrote to memory after end of heap buffer.
这个意思大概就是溢出吧?
 楼主| 发表于 2006-8-23 22:27:04 | 显示全部楼层
更诡异的事情出现了...代码在debug模式下无问题一切正常,一单独运行就要调试....

这都是什么和什么啊
发表于 2006-8-23 23:57:54 | 显示全部楼层
debug和release的new、delete版本是不一样的
debug包含了更多的信息。
 楼主| 发表于 2006-8-24 00:54:23 | 显示全部楼层
那就是说问题还在new和delete上咯  真头痛... 我除了频繁的申请和消除 其他的没做啊
发表于 2006-8-24 01:46:00 | 显示全部楼层
int *p = new int[N]的时候实际分配了大于N的空间,或称BLOCK。
这个BLOCK有BLOCK头,用户可用部分、BLOCK尾,指针p实际指向的就是用户可用部分。
BLOCK头、尾里面都有一些关于这个BLOCK的相关信息:堆链表指针,BLOCK大小,BLOCK类型,栅栏,校验和等等,而这些信息将在delete的时候检查它们的正确性。
例如你在使用p的时候发生了越界,破坏了BLOCK头或尾里面的一些信息,在delete的时候被检查出来就会报错。
顶楼的例子就是BLOCK尾被破坏的错误。
 楼主| 发表于 2006-8-24 03:33:25 | 显示全部楼层
哦理解了,我仔细检查了 并做了大量的越界检查,已经没有越界了
谢谢!
 楼主| 发表于 2006-8-23 18:24:11 | 显示全部楼层 |阅读模式
  1. void str2str(char *lpStr)
  2. {
  3.    if(lpStr==NULL) _ERROR("str2str(...) toke a null string.");
  4.    char *lpTemp;
  5.    lpTemp=new char[strlen(lpStr)+1];
  6.    char *lpTempStr=lpTemp;
  7.    int nPstr=0;
  8.    while(*(lpStr+nPstr)!=NULL&&*(lpStr+nPstr)!=0x0a)
  9.    {
  10.       switch(*(lpStr+nPstr))
  11.       {
  12.       case '\'':
  13.         *lpTempStr=*(lpStr+nPstr);
  14.         lpTempStr++;
  15.         nPstr++;
  16.         while(*(lpStr+nPstr)!='\'')
  17.         {
  18.            if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
  19.               _ERROR("Did u foget some " ?");
  20.            *lpTempStr=*(lpStr+nPstr);
  21.            lpTempStr++;
  22.            nPstr++;
  23.            if(*(lpStr+nPstr++)=='\\')
  24.            {
  25.               if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
  26.               _ERROR("Did u foget some " ?");
  27.               *lpTempStr=*(lpStr+nPstr);
  28.               lpTempStr++;
  29.               nPstr++;
  30.            }
  31.         }
  32.         *lpTempStr=*(lpStr+nPstr);
  33.         nPstr++;
  34.         lpTempStr++;
  35.         break;
  36.       case '"':
  37.         *lpTempStr=*(lpStr+nPstr);
  38.         lpTempStr++;
  39.         nPstr++;
  40.         while(*(lpStr+nPstr)!='"')
  41.         {
  42.            if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
  43.               _ERROR("Did u foget some \' ?");
  44.            *lpTempStr=*(lpStr+nPstr);
  45.            lpTempStr++;
  46.            nPstr++;
  47.            if(*(lpStr+nPstr++)=='\\')
  48.            {
  49.               if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
  50.               _ERROR("Did u foget some \' ?");
  51.               *lpTempStr=*(lpStr+nPstr);
  52.               lpTempStr++;
  53.               nPstr++;
  54.               
  55.            }
  56.         }
  57.         *lpTempStr=*(lpStr+nPstr);
  58.         nPstr++;
  59.         lpTempStr++;
  60.         break;
  61.       case 0x09:
  62.       case 0x20:
  63.         *lpTempStr=0x20;
  64.         lpTempStr++;
  65.         nPstr++;
  66.         while(Spaceword( *(lpStr+nPstr) )) nPstr++;
  67.         break;
  68.       default:
  69.         *lpTempStr=tolower(*(lpStr+(nPstr++)));
  70.         lpTempStr++;
  71.       }
  72.    }
  73.    *(lpTempStr++)=0x0a;
  74.    *lpTempStr=NULL;
  75.    strcpy(lpStr,lpTemp);
  76.    delete[] lpTemp;
  77. }
复制代码

提示奇怪的
HEAP CORRUPTION DETECTED: after Normal block (#93) at 0x008E3EA0.
CRT detected that the application wrote to memory after end of heap buffer.
VS版本2005
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-28 15:33 , Processed in 0.011515 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表