08年计算机:malloc动态分配的内存的生存周期是?-1_全国计算机考试_ ...

 malloc动态分配的内存的生存周期是多少??当时直接回答,当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题,在free调用之前那段范围内,但free只有一个指针参数,它是如何知道要释放多少空间呢??比如:
   int*pInt=(int*)malloc(10*sizeof(int));
   …….;
   free(p);
   这里free是如何知道释放10个int大小的空间呢??既然free只需要一个参数—指针类型,那么这个地址(malloc返回的)一定作过什么特殊处理了.于是我问了一些网上的朋友,我得出以下一些结果:
   char*p=malloc(size):
   1. 实际分配一块size 4大小的内存,char *p 内存首地址。
   2. *((int *)p) size; //把大小放在分配内存的起始处。
   3. return (void*)(p 4); //返回除去存放大小以后的部分。
   free(p); 1. char* (char *)p 4;
   2. int size *((int *)q); //这里找到了size...
   3. 通过操作系统释放内存或自己管理C/C++堆内存.
   这里要涉及到一些OS管理内存得问题,非我力所能及,但我们可以知道,malloc确实实施了一些特殊的处理.言归正传.让我们看看下面一段c++代码:
   int*p=new int[10];
   delete []p;
   一眼就看出上面得代码完成的和上面的c代码一样的功能.这里有同样的问题,为什么delete
   能在不指定动态分配的数组size下就能释放所分配的对象呢,是不是new操作也对返回的地址作了一些手脚???答案:是.new所作的处理和上面的方法一样的,即:new所传回的每一个内存区域配置一个额外的DWORD,然后把元素数目包藏到那个DWORD中.(不是所有编译器都采用这个方法的,我只试过vc6和bcc55编译器,它们都采用这个方法.不过,<<深度探索c++对象模型>>上只是说配置一个额外的word<两字节>).为了验证这个说法,我写下了下面的代码进行测试.

原文:更多请访问教育联展网()!

已投稿到:
郑重声明:资讯 【08年计算机:malloc动态分配的内存的生存周期是?-1_全国计算机考试_ ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——