mallco动态分配_malloc动态分配的内存的生存周期是多少?
曾经有一个朋友提过这样一个问题,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* q = (char *)p - 4;
2. int size = *((int *)q); //这里找到了size...
3. 通过操作系统释放内存或自己管理C/C++堆内存.
这里要涉及到一些OS管理内存得问题,非我力所能及,但我们可以知道,malloc确实实施了一些特殊的处理.言归正传.让我们看看下面一段c++代码:
int*p=new int;
delete []p;
一眼就看出上面得代码完成的和上面的c代码一样的功能.这里有同样的问题,为什么delete
能在不指定动态分配的数组size下就能释放所分配的对象呢,是不是new操作也对返回的地址作了一些手脚?答案:是.new所作的处理和上面的方法一样的,即:new所传回的每一个内存区域配置一个额外的DWORD,然后把元素数目包藏到那个DWORD中.(不是所有编译器都采用这个方法的,我只试过vc6和bcc55编译器,它们都采用这个方法.不过,深度探索c++对象模型上只是说配置一个额外的word两字节).为了验证这个说法,我写下了下面的代码进行测试.
#includeiostream.h
class complex
{
public:
complex(int=0,int=0){cout"complex()"endl;}
~complex(){cout"~complex()"endl;}
private:
int i,j;
};
int main()
{
complex*array=new complex;
long*t=(long*)((char*)(array)-4);
cout*tendl;//(1)
//*t=20; //(2)
delete []array;
return 0;
}
其中(1)输出array数组的维数10.这里很明显了,动态分配complex对象的个数就是放在返回array地址前一个DWORD(四个字节)内.现在问题解决了,我们已经知道new所作的什么处理了,^_^,不过问题又来了,编译器采取的策略会不会引起我们忧虑对,的确,只要我们修改那个DWORD的内容,那delete就不能正确释放所分配的内存空间了.(^_^.你试试把(2)前面那条的注释给去掉,就会有意想不到的输出)
结论:c++编译器为我们做了太多的事,导致了c++很复杂,有些东西,让编译器修改得连我们都不认识自己的代码了,有些东西如果搞明白了,学其他的(比如COM,ATL等,虽然本问与此关系不大)或许会轻松许多的.
补充:这是小弟第一篇处女作,肯定有很多说得不当的地方,还请各位大小谅解.我得于众多csdn上的朋友相助,还参考了侯老师的那本深度探索c
++对象模型
mallco动态分配_malloc动态分配的内存的生存周期是多少?相关推荐
- C语言计算机二级考动态分配内存吗,08年计算机二级C语言辅导:malloc动态分配的内存的生存周期是多少?...
malloc动态分配的内存的生存周期是多少??当时直接回答,当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题,在free调用之前那段范围内,但free只有一个指针参数,它是如何知道要释放 ...
- STL容器存储的内容动态分配情况下的内存管理
主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看以下两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirO ...
- C语言_malloc动态开辟内存空间
malloc动态开辟内存空间 01--malloc动态开辟内存空间函数: 通常定义数组的时候就把内存地址定好了,比如: ind data[] = {1,2,3,4,5}; char cdata[6] ...
- C语言内存动态分配与释放
一.内存分配 对于内存的分配,主要采用的是标记法. 分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配.例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配 ...
- C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- C++进阶——内存管理(一)
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- C++内存管理与指针的使用
摘引:http://blog.csdn.net/tiangwan2011/article/details/7909390 导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++ ...
- 关于C++的内存管理
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- 【嵌入式】初学者一步一步搞懂内存管理
[嵌入式]初学者一步一步搞懂内存管理 一.C语言局部变量.静态局部变量.全局变量与静态全局变量 基本概念 局部变量 全局变量 局部变量和全局变量的对比 二.虚拟地址空间.(深入理解计算机系统) bss ...
最新文章
- TBContact -- 导出ThunderBird邮件地址本
- python和c哪个好学-C/C++和Python哪个更有前景?
- python运行不了指令_python不是内部命令或外部命令,也不是可执行程序解决方法...
- Spring MVC,Spring Boot文件上传
- c语言长度宏定义运算符,C语言在宏定义中使用语句表达式和预处理器运算符
- 【合并两个有序的子数组】算法实现
- c语言中f1(a 25),C语言程序设计A 200901-201707历年考试选择题(全)doc.docx
- 【总线】一文看懂 I2C 通信协议
- fork函数原型与用法
- pytorch关系抽取框架OpenNRE源码解读与实践:PCNN ATT
- 彩影2008 白金版 10.1 build 2010
- 14周:设计会员登录页面
- plsql报错:Not logged on
- 《Java并发编程的艺术》-方腾飞、魏鹏、程晓明
- 作品展第二周——痛并快乐着
- 猫推荐算法大赛Top 9团队
- Cadence OrCAD Capture 原理图设计过程产生的文件总结与说明
- 程序员如何一句话教老板做事?“我先下班了,你可要加把劲啊”
- win10家庭版怎么删除多余的用户
- Hive常用函数大全