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真奇怪
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真奇怪
...全文
相关推荐
Datatable删除行的Delete和Remove方法的区别介绍
Datatable删除行的Delete和Remove方法的区别介绍,需要的朋友可以参考一下
C++内存分配情况
C++内存分配
内存中的堆与栈区别 内存中的堆与栈区别
程序中用来存放数据的内存分为四块,其实另有一块用于存放代码,这里我们不讨论,这四块分别是:
详解ES6通过WeakMap解决内存泄漏问题
本篇文章主要介绍了详解ES6通过WeakMap解决内存泄漏问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
SQL删除语句DROP、TRUNCATE、 DELETE 的区别
DROP: DROP TABLE test; 删除表test,并释放空间,将test删除的一干二净。 TRUNCATE: TRUNCATE test; 删除表test里的内容,并释放空间,但不删除表的定义,表的结构还在。 DELETE: 1、删除指定数据 删除表test中年龄等于30的且国家为US的数据 DELETE FROM test WHERE age=30 AND country='US'; 2、删除整个表 仅删除表test内的所有内容,保留表的定义,不释放空间。 DELETE FROM test 或者 TRUNCATE test; truncate table 命令将快速删除数


