new&delete
在c语言里面,malloc和free经常配套出现,而在C++里面用到的则是new和delete
下面是一段malloc动态内存分配:
#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
int* pi = (int*)malloc(sizeof(int)*1024);
return 0;
}
给malloc加个断点
转到反汇编
我们看到只有一个call,所以直接跟进这个malloc函数
也只有一个call,跟进去。照此步骤一直找call,直到找到HeapAlloc函数
发现这次的call是个FF间接call,这个HeapAlloc函数就是malloc调用的最后的函数了
这个call的函数的最后有个地址0042d16c,这是个IAT表,所以这个call调用的并不是这个0042d16c,而是这个地址里面存的值
跟进这个地址,我们发现,地址的大小已经大变样了,7C开头的地址证明已经到dll的领空了
通过查询我们发现HeapAlloc函数是KERNEL32.dll导入库下的一个API。也就是说,我们甚至可以直接用HeapAlloc函数进行内存分配,只是里面的参数太多,需要我们自己设置,太麻烦,而malloc是直接就能用的,所以我们平时用的是malloc
然后再对new进行跟踪,我们总结发现经过层层调用它们的本质其实是一样的,都是最后调用HeapAlloc函数进行内存分配。free和delete的本质也是同理
本文为参考滴水三期的学习笔记,若有错误请指正,谢谢