门户网站 字体,福州免费项目建设管理系统,wordpress 微信通知,超级折扣2WordPress曾经有一个朋友提过这样一个问题#xff0c;malloc动态分配的内存的生存周期是多少当时直接回答#xff0c;当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题#xff0c;在free调用之前那段范围内#xff0c;但free只有一个指针参数#xff0c;它是如何知道要释…曾经有一个朋友提过这样一个问题malloc动态分配的内存的生存周期是多少当时直接回答当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题在free调用之前那段范围内但free只有一个指针参数它是如何知道要释放多少空间呢比如:int*pInt(int*)malloc(10*sizeof(int));…….;free(p);这里free是如何知道释放10个int大小的空间呢既然free只需要一个参数—指针类型那么这个地址(malloc返回的)一定作过什么特殊处理了.于是我问了一些网上的朋友我得出以下一些结果:char*pmalloc(size):1. 实际分配一块size 4大小的内存char *p 内存首地址。2. *((int *)p) size; //把大小放在分配内存的起始处。3. return (void*)(p 4); //返回除去存放大小以后的部分。free(p); 1. char* q (char *)p - 4;2. int size *((int *)q); //这里找到了size...3. 通过操作系统释放内存或自己管理C/C堆内存.这里要涉及到一些OS管理内存得问题非我力所能及但我们可以知道malloc确实实施了一些特殊的处理.言归正传.让我们看看下面一段c代码:int*pnew int;delete []p;一眼就看出上面得代码完成的和上面的c代码一样的功能.这里有同样的问题为什么delete能在不指定动态分配的数组size下就能释放所分配的对象呢是不是new操作也对返回的地址作了一些手脚?答案:是.new所作的处理和上面的方法一样的即:new所传回的每一个内存区域配置一个额外的DWORD然后把元素数目包藏到那个DWORD中.(不是所有编译器都采用这个方法的我只试过vc6和bcc55编译器它们都采用这个方法.不过深度探索c对象模型上只是说配置一个额外的word两字节).为了验证这个说法我写下了下面的代码进行测试.#includeiostream.hclass complex{public:complex(int0int0){coutcomplex()endl;}~complex(){cout~complex()endl;}private:int ij;};int main(){complex*arraynew complex;long*t(long*)((char*)(array)-4);cout*tendl;//(1)//*t20; //(2)delete []array;return 0;}其中(1)输出array数组的维数10.这里很明显了动态分配complex对象的个数就是放在返回array地址前一个DWORD(四个字节)内.现在问题解决了我们已经知道new所作的什么处理了^_^不过问题又来了编译器采取的策略会不会引起我们忧虑对的确只要我们修改那个DWORD的内容那delete就不能正确释放所分配的内存空间了.(^_^.你试试把(2)前面那条的注释给去掉就会有意想不到的输出)结论:c编译器为我们做了太多的事导致了c很复杂有些东西让编译器修改得连我们都不认识自己的代码了有些东西如果搞明白了学其他的(比如COMATL等虽然本问与此关系不大)或许会轻松许多的.补充:这是小弟第一篇处女作肯定有很多说得不当的地方还请各位大小谅解.我得于众多csdn上的朋友相助还参考了侯老师的那本深度探索c对象模型