new申请到的内存除了delete,还有哪些方法让内存消失
代码如下:
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




