曾经有一个朋友提过这样一个问题,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动态分配的内存的生存周期是多少?相关推荐

  1. C语言计算机二级考动态分配内存吗,08年计算机二级C语言辅导:malloc动态分配的内存的生存周期是多少?...

    malloc动态分配的内存的生存周期是多少??当时直接回答,当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题,在free调用之前那段范围内,但free只有一个指针参数,它是如何知道要释放 ...

  2. STL容器存储的内容动态分配情况下的内存管理

    主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看以下两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirO ...

  3. C语言_malloc动态开辟内存空间

    malloc动态开辟内存空间 01--malloc动态开辟内存空间函数: 通常定义数组的时候就把内存地址定好了,比如: ind data[] = {1,2,3,4,5}; char cdata[6] ...

  4. C语言内存动态分配与释放

    一.内存分配 对于内存的分配,主要采用的是标记法. 分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配.例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配 ...

  5. C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  6. C++进阶——内存管理(一)

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  7. C++内存管理与指针的使用

    摘引:http://blog.csdn.net/tiangwan2011/article/details/7909390 导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++ ...

  8. 关于C++的内存管理

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  9. 【嵌入式】初学者一步一步搞懂内存管理

    [嵌入式]初学者一步一步搞懂内存管理 一.C语言局部变量.静态局部变量.全局变量与静态全局变量 基本概念 局部变量 全局变量 局部变量和全局变量的对比 二.虚拟地址空间.(深入理解计算机系统) bss ...

最新文章

  1. TBContact -- 导出ThunderBird邮件地址本
  2. python和c哪个好学-C/C++和Python哪个更有前景?
  3. python运行不了指令_python不是内部命令或外部命令,也不是可执行程序解决方法...
  4. Spring MVC,Spring Boot文件上传
  5. c语言长度宏定义运算符,C语言在宏定义中使用语句表达式和预处理器运算符
  6. 【合并两个有序的子数组】算法实现
  7. c语言中f1(a 25),C语言程序设计A 200901-201707历年考试选择题(全)doc.docx
  8. 【总线】一文看懂 I2C 通信协议
  9. fork函数原型与用法
  10. pytorch关系抽取框架OpenNRE源码解读与实践:PCNN ATT
  11. 彩影2008 白金版 10.1 build 2010
  12. 14周:设计会员登录页面
  13. plsql报错:Not logged on
  14. 《Java并发编程的艺术》-方腾飞、魏鹏、程晓明
  15. 作品展第二周——痛并快乐着
  16. 猫推荐算法大赛Top 9团队
  17. Cadence OrCAD Capture 原理图设计过程产生的文件总结与说明
  18. 程序员如何一句话教老板做事?“我先下班了,你可要加把劲啊”
  19. win10家庭版怎么删除多余的用户
  20. Hive常用函数大全

热门文章

  1. Laravel数据库迁移和填充(支持中文)
  2. 512M内存编译php出错
  3. 【JSP笔记】第三章 JSP内置对象【上】
  4. php 递归创建目录、递归删除非空目录、迭代创建目录
  5. 1.对程序的看法 2013.8.1
  6. 阿里巴巴指东打西,PC之后卖盒饭?
  7. Lockdown Wheelie项目
  8. 5902. 检查句子中的数字是否递增
  9. pytorch深度学习_在本完整课程中学习在PyTorch中应用深度学习
  10. 任务完成:我从CNC2018 GetAJob挑战中学到的东西