1.free()函数入参是一个void*指针,它是如何知道被指向的大小的?
举个例子:假设你用malloc需要申请100字节,实际是申请了104个字节。把前4字节存成该块内存的实际大小,并把前4字节后的地址返回给你。 free释放的时候会根据传入的地址向前偏移4个字节 从这4字节获取具体的内存块大小并释放。
2、c/c++程序如何控制执行到某个特定内存地址?
如果想让程序跳转到绝对地址0x100000处执行,可以把绝对地址0x100000强制转换成函数指针,然后再用函数指针的方式调用函数就可以了。
先将 0x100 转化为 函数指针 (void(*)()) 0x100
然后再调用它:
((void()())0x100)();
3、在一台内存为2G的机器上,malloc(20G)会怎么样?new 20G呢?
1)首先,malloc和new申请的都是虚拟内存
2)malloc函数的实质,有一个将可用的内存块连接起来的链表,调用malloc的时候,会沿着链表找一个满足用户需求的内存块。然后将这个内存块一分为二,一块和用户所申请的内存大小相同,另一块返回到链表中。如果用户申请一个大的内存块,空闲链表上可能没有可以满足用户要求的片段,这个时候malloc函数就会请求延时,对链表上的内存进行整理。如果还是不可以的话, 内存申请失败,返回NULL
3)new的话,底层实现还是malloc,在分配失败的时候会抛出bad_alloc类型的异常