正文

C++中的内存分配 memory management2006-09-29 12:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yourtommy/18937.html

分享到:

很早之前一直遗留的问题终于在今天得以解决。

程序在运行时需要的内存通过下面3种方法获得:

一、全局变量(包括静态局部变量等):在程序运行之前在静态内存空间分配。它们的生命周期是整个程序的运行过程。
2006-11-14     16:15 补充:
若在函数f()中定义一个静态变量a,则a在f()被调用的时候构造,在程序退出时被析构。

二、局部变量(包含在{}中):在栈(stack)中分配。
函数的调用过程(函数调用时的参数、函数返回地址、函数返回值、函数体内的其它变量等如何在栈中进行处理)现在还不是很懂,过段时间再来补充。
2006-11-14     16:27 补充:
函数在被调用时,首先将其参数压入栈中,标准为逆序(即从右向左压入);然后将函数的返回值地址压入;最后是函数内部的局部变量。当函数要返回(return)时,弹出所有局部变量,之后(1)C语言中把返回值压到返回地址的顶部;(2)而C++中返回值在寄存器里,直接写入返回值地址中,这样就可以避免中断之类所造成的返回值丢失的问题。

三、运行时对象:在堆(heap)中分配,必须手动释放内存空间。
(1)  生存周期:如果你不手动释放,则一直持续到程序结束;
(2)  void指针:如果将开辟的空间地址赋给一个void指针,它能记住这个空间的大小,当delete它时它能正确地释放这个大小的空间,与释放非void指针唯一不同的是它不调用析构方法;
(3)  动态对象数组:当动态定义一个对象数组时,这个数组内的所而对象都调用了它们各自的构造方法,A* ap = new A[100]; 在析构这个数组时,如果是delete []ap,则调用数组内所有对象的析构方法,并释放这100个对象所占的空间;如果是delete ap,则只调用数组内的第一个对象的析构方法,然后释放整个数组占用的空间(在试验时用这种释放空间的方法在调用第一个对象的析构方法、准备释放空间时会出现错误,所以要释放数组时就应采取第一种方式)。

阅读(3390) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册