CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

new申请到的内存除了delete,还有哪些方法让内存消失

楼主TG1005()2006-05-02 22:45:41 在 VC/MFC / 基础类 提问

代码如下:  
  void   DeCodePackages()  
  {  
  int     i   =   0;  
  BYTE*   p1;  
  BYTE*   p2;  
  BYTE*   p3;  
  while   (   Buf_Array[i]   )  
  {  
  p1   =   Buf_Array[i];  
  if(   *(p1+4)   ==   0x78   )  
  {  
  p2   =   new   BYTE   [   *(DWORD*)p1   +   20   ];  
   
  CopyMemory(   p2,   &Buf_DeCode[0],   sizeof(Buf_DeCode)   );  
  CopyMemory(   (p2+8),p1,4   );  
  CopyMemory(   p2+20   ,p1+4,   *(DWORD*)p1   );  
  p3   =(BYTE*)   DeCode(   (DWORD)p2   ); //解密后的缓冲区没有释放  
  CopyMemory(   p3+16,p3+8,4   );  
  p1   =   new   BYTE   [   *(DWORD*)(p3+8)   +   4   ];  
   
  CopyMemory(p1,p3+16,*(DWORD*)(p3+8)   +   4);  
  delete   []   Buf_Array[i];  
  Buf_Array[i]   =   p1;  
  delete   []   p2;  
  }  
  i++;  
  }  
  }  
  Buf_Array是一个指针数组,用OD调试,在Buf_Array[i]   =   p1;这里下断点,一个一个观察,发现完全正常,Buf_Array里的指针指向的缓冲区都是存在的  
  如果我不下断点,直接对Buf_Array观察发现总有几个指针指向的缓冲区消失了,这BUG真奇怪 问题点数:20、回复次数:12Top

1 楼avicut()回复于 2006-05-02 22:51:33 得分 0

new申请的内存,必须用delete释放,  
  malloc申请的,必须用free释放,  
  否则运行结果是不可预测的。Top

2 楼avicut()回复于 2006-05-02 23:01:24 得分 0

哦,对不起,刚才没仔细看你的问题,你指的缓冲区消失是什么意思?是指针变成NULL,还是什么?Top

3 楼TG1005()回复于 2006-05-02 23:01:31 得分 0

如果只有delete,可我的代码没错  
  我工程里只有上面这段代码里有deleteTop

4 楼avicut()回复于 2006-05-02 23:05:14 得分 20

p2   =   new   BYTE   [   *(DWORD*)p1   +   20   ];  
  p1   =   new   BYTE   [   *(DWORD*)(p3+8)   +   4   ];  
   
  建议楼主将这两块内存分配的大些再调试一下,如果没有问题,说明你分配的空间不够,或者是  
  CopyMemory时发生越界。  
   
  Top

5 楼TG1005()回复于 2006-05-02 23:05:38 得分 0

指针没变成NULL,而是指针指向的缓冲区消失了,比如Buf_Array[1]   =   0x0900000,  
  0x09000000指向的缓冲区却没有了,用Ollydbg的话就是:指定地址处没内存Top

6 楼TG1005()回复于 2006-05-02 23:13:17 得分 0

不存在越界情况,这样会导致DeCode函数调用失败  
  就算CopyMemory时发生越界,比如把p3指向的缓冲区拷贝到p1,也不可能导致内存消失  
  new申请内存也都成功了,Buf_Array里面的指针都不是0Top

7 楼avicut()回复于 2006-05-02 23:26:58 得分 0

如果是这样,那就不好调了,建议你再循环中加入  
  TRACE(   Buf_Array[i]指向的内容的代码   );  
  如果缓冲区真的没有了,会抛出异常的Top

8 楼TG1005()回复于 2006-05-02 23:41:34 得分 0

TRACE没用过,能写个简短的例子吗Top

9 楼avicut()回复于 2006-05-02 23:57:29 得分 0

和printf用法一样  
  int   i=1;  
  TRACE("%d\n",   i);Top

10 楼TG1005()回复于 2006-05-03 00:33:20 得分 0

经过跟踪,发现内存消失不是在void   DeCodePackages()函数内,而是在别的地方,这就说明不是用delete删除的,因为别的地方没有delete代码,难道除了delete还有别的可以释放delete生成的内存。。。Top

11 楼TG1005()回复于 2006-05-03 00:42:34 得分 0

这BUG太诡异了,只要不下断点他就出现,下了断点他永远不出现Top

12 楼TG1005()回复于 2006-05-03 01:06:06 得分 0

这是OD的BUG,汗Top

相关问题

关键词

得分解答快速导航

  • 帖主:TG1005
  • avicut

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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