CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

奇怪的delete[]

楼主nwumengfei(孟斐)2006-07-01 10:53:00 在 C/C++ / C++ 语言 提问

动态字符数组:  
  char   *sSentence;  
  char   *sSentenceResult;  
  //分配空间  
  sSentence=new   char[nLen];//nLen是传入的整形参数  
  sSentenceResult=new   char[nLen*3];  
  //处理  
  .  
  .  
  .  
  //释放  
  delete[]   sSentence;//调试发现释放时Assert   Failed(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))  
  delete[]   sSentenceResult;//同上  
  运行时宣告失败忽略后,就是Access   Violation。还有就是并不是每次都出错,大家讨论一下是怎么回事? 问题点数:60、回复次数:22Top

1 楼JessC(人类一思考,上帝就发笑.)回复于 2006-07-01 11:20:57 得分 0

DEBUG_NEW有内存诊断能力,出现这种情况的一个解释是:操作出界Top

2 楼nwumengfei(孟斐)回复于 2006-07-01 11:32:12 得分 0

难道new的空间和delete不一致吗?怎么会出现这种情况的?怎么解决啊?能不能指点一下?Top

3 楼JessC(人类一思考,上帝就发笑.)回复于 2006-07-01 11:57:24 得分 0

我是说,看一下,你的操作是不是超出了分配的内存大小Top

4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-01 12:15:16 得分 0

_BLOCK_TYPE_IS_VALID  
   
  虽然这个信息不是绝对给出了问题所在,  
  但是也可以查查   ....  
   
  呵呵,还没有遇见这个问题过   ..  
  看看对这个   new   的空间有那些操作吧   ...  
   
  或者把你的   delete[]   位置上调,   看看在   哪个操作后这个delete[]   失效  
  呵呵     这是个笨办法         见笑...Top

5 楼Piboye(柳月清风)回复于 2006-07-01 12:21:35 得分 0

很可能你改了   sSentence;sSentenceResult;的值,也可能中途释放了内存过  
   
  Top

6 楼UPCC(杂食动物)回复于 2006-07-01 12:38:41 得分 20

delete[]   sSentence;//调试发现释放时Assert   Failed(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))  
  delete[]   sSentenceResult;//同上  
  ------------------------------  
  其实很简单,你把sSentence,sSentenceResult指针移动了(比如sSentence++一类的),所以就出现那样的问题。  
   
  你应该这样:  
   
  char   *sSentence,*tmpsSentence;  
  char   *sSentenceResult,*tmpsSentenceResult;  
  //分配空间  
  tmpsSentence=sSentence=new   char[nLen];//nLen是传入的整形参数  
  tmpsSentenceResult=sSentenceResult=new   char[nLen*3];  
  .............  
  delete[]   tmpsSentence;  
  delete[]   tmpsSentenceResult;Top

7 楼OOPhaisky(异化$渴望成功~~)回复于 2006-07-01 14:43:24 得分 0

同意UPCC(杂食动物),在你的“处理”过程中肯定做了不该做的事情。Top

8 楼nwumengfei(孟斐)回复于 2006-07-01 21:28:49 得分 0

按说按照UPCC(杂食动物)老兄的说法即便是修改了sSentence和sSentenceResult  
  delete的时候应该能删除掉吧,不会断言失败以及Access   Violation吧!  
  可是我按照老兄说的修改后还是这样儿!  
  ◎##¥¥%……Top

9 楼UPCC(杂食动物)回复于 2006-07-01 21:48:15 得分 0

那就贴代码啊,不要让大家来猜的Top

10 楼nwumengfei(孟斐)回复于 2006-07-01 22:41:23 得分 0

代码挺多的,是中科院计算所的分词程序ICTCLAS:  
  下载地址:  
  http://www.nlp.org.cn/project/project.php?proj_id=6  
  有兴趣的可以下载调试!  
  注意:标注成XML格式时有问题!Top

11 楼nwumengfei(孟斐)回复于 2006-07-02 15:28:25 得分 0

再顶Top

12 楼UPCC(杂食动物)回复于 2006-07-02 16:08:48 得分 0

下载失败。密码...Top

13 楼lddLinan(不再五行中)回复于 2006-07-02 16:27:46 得分 10

将char   *sSentence;  
  char   *sSentenceResult;  
  改为char   *   const   sSentence;  
  char   *const   sSentenceResult;然后编译看看是否有地方修改了sSentence,   sSentenceResult.  
   
  BTW:lz是计算所的么?我有好几个同学都在那里Top

14 楼nwumengfei(孟斐)回复于 2006-07-03 10:00:02 得分 0

俺   不是   目前需要作东西需要分词   这是个词法分析器!  
  我试试看!Top

15 楼qiaozhiwei(乔)回复于 2006-10-30 11:21:45 得分 0

是sSentence的地址改变了,看下有没有类似   sSentence   =...这样的操作,会使指针位置变化Top

16 楼corrupt(喜欢 睡在床板下 的思考)回复于 2006-10-30 14:32:57 得分 0

不用怀疑,肯定是   自己中途指针   操作错误Top

17 楼weijiangshanwww(天气预报:今天会下分,偶尔下几颗星星!)回复于 2006-10-30 14:48:34 得分 0

delete[]   sSentence;//调试发现释放时Assert   Failed(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))  
  delete[]   sSentenceResult;//同上  
  运行时宣告失败忽略后,就是Access   Violation。还有就是并不是每次都出错,大家讨论一下是怎么回事?  
   
  ==========================================  
  ACCESS   VIOLATION肯定是你的指针的错误了!  
   
   
  检查你的指针,而且不是每次出错则可能是没执行指针出错的地方Top

18 楼szpc689()回复于 2006-10-30 14:52:02 得分 0

我想是nLen   大于你实际控制数,所以在输出时有那样的提示。要么不输出,要么小于实际的控制数Top

19 楼xxyyboy(壮志凌云)(★★★★★)回复于 2006-10-30 17:10:44 得分 10

空间的删除和分配,跟空间中的值没有关系。  
  1。指针是不是被改变了,加const验证一下。  
  2。有没有成功的申请到内存,也就是说指针是否是有效的?Top

20 楼li01bin(啊!斌)回复于 2006-10-31 15:51:48 得分 10

小伙子些的代码挺好的,如果再多些判断就更好了。  
  char   *sSentence   =   NULL;  
  char   *sSentenceResult   =   NULL;  
  //分配空间  
  sSentence=new   char[nLen];//nLen是传入的整形参数  
  if   (sSentence   ==   NULL)  
  {  
      //error  
  }  
  sSentenceResult=new   char[nLen*3];  
  if   (sSentenceResult   ==   NULL)  
  {  
    //error  
  }  
  //处理  
  .  
  .  
  .  
  //释放  
  if   (sSentence   !=   NULL)  
  {  
  delete[]   sSentence;  
  sSentence   =   NULL;  
  }  
  if   (sSentenceResult   !=   NULL)  
  {  
  delete[]   sSentenceResult;//同上  
  sSentenceResult   =   NULL;  
  }  
  Top

21 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-31 15:55:29 得分 0

li01bin(啊!斌)是学院派的吧。  
  new如果失败,是直接抛异常的,根本不会给你做if   (!=   NULL)判断的机会的。  
  delete对于0是完全正确地接受的,不需要做这个额外判断的。Top

22 楼zwh37333()回复于 2006-10-31 19:13:30 得分 10

兄弟,你的分配内存和释放没有问题,在这其中你的操作可能是访问越界,写入了该分配空间之外,而且是下界超限,破坏了空间大小信息。Top

相关问题

关键词

得分解答快速导航

  • 帖主:nwumengfei
  • UPCC
  • lddLinan
  • xxyyboy
  • li01bin
  • zwh37333

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo