首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

360面试题,delete/delete[]/free怎么知道该释放多少内存

2013-11-29 
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; 
}

热点排行