360面试题,delete/delete[]/free如何知道该释放多少内存?如题,delete/delete[]/free如何知道该释放多少内
360面试题,delete/delete[]/free如何知道该释放多少内存?
如题,delete/delete[]/free如何知道该释放多少内存呢?
有人说是在new的时候额外在内存开始处添加了额外的内存记录大小,但我们知道:
[解决办法]这个不用程序员操心了吧,在分配每块内存的时候,都有额外的空间来记录分配内存的大小的.
建议你看一下<<程序员的自我修养中>>最后一章中,有个自己实现运行时库的代码,这个代码中就有如何实现malloc,free,delete等操作的简化代码.
[解决办法]分配时会簿记,删除时先查询是否存在。
具体请看 http://www.opensource.apple.com/source/Libc/Libc-594.1.4/gen/malloc.c
find_registered_zone 函数实现查找过程
[解决办法]一般的做法是在分配的内存前边加一个长度值,但这个是compiler specific的,也不排除有编译器会使用查表法或其它更高明的办法。而且 new 和 delete 运算符可以重载,理论上你想怎么记都可以。
如果是采用前边存长度的做法,那么长度是记录在返回的指针前边的,也就是 reinterpret_cast<size_t*>(p) - 1的位置(当然不一定是size_t类型的)。也就是说你假如你申请4字节的内存,那系统很可能是分配了8字节,然后4字节记录长度,另4字节给你用。你delete时,系统会根据你提供的指针p进行 *(reinterpret_cast<size_t*>(p) - 1)来取得长度值。
[解决办法]这个是操作系统记录的啊,new delete可以看作是程序和操作系统的交互
指针如何知道是指针,指针所指的内存块的大小,这都记录在操作系统里面吧,我是这么想的不知道对不对
指针占4个字节,就是记录了地址,所指的内存块大小,肯定是有个地方会记录的,猜测是map
[解决办法]这种东西和分配内存的算法实现有关,
用 要 释放的内存做索引,查找 相关的结构就得到内存的大小
free 可以不需要知道内存大小。
delete 也可以不需要知道内存大小。
delete[] 才需要知道内存大小,分配了几个对象。
因为要调用析构函数。
如果,你遇到这个问题,他并不是考你的;
如何搞个统一的,可移植的函数,获取所分配的内存的大小,和对象个数。
而是,考你知不知道,系统内存分配的算法,了解多少!
你知道多少,就回答多少好了;
不然,你可以自己设计一个算法;
告诉考官,可以用这种方式实现内存分配,即可。
最简单的算法 在分配内存的前面一个位置,存储分配的内存大小(或者分配的对象个数)
//
void *malloc(int size){
void *p = find_free_mem(size);
//find_free_mem 是一个算法,用于查找可以分配size大小内存的内存块
//。。。。。。 //其他操作,比如设置链表头,这里会移动指针p
int *plength = p;
* plength = size;
return ++ plength;//返回,记录后面的内存
}
// 获得分配的内存大小
int getallocsize(void *p){
int * plength =p;
return * --plength;
}