上篇讲了代码区和全局区,本节关于栈区与堆区
一.首先是栈区
栈区存放局部变量(包括const修饰的局部变量),形参等
栈区的数据由编译器自动分配释放,存放函数的参数值,局部变量等。
另外要注意,函数不能返回局部变量的地址,因为栈区开辟的数据由编译器自动释放。例如:
输出结果为:
注释:这里f函数里的p为局部变量,其被储存在栈区中。该处返回了局部变量p的地址,在main函数中用整型指针a接收并对a进行解引用和打印。打印第一行能出现正确的数字是因为编译器进行了一次保留,但在此后自动释放了p开辟的地址,导致第二次打印输出为错误的数据。
二.堆区
堆区比较自主化,由程序员来进行操作,有以下两点:
1.堆区是由程序员分配和释放空间的。如果程序员不进行释放也不会一直保存,操作系统会进行回收。
2.堆区的空间用new来开辟,用delete来进行释放。(如果不释放可能会出现内存泄漏问题,运行会崩溃)
结果为:
下面顺便一提new和delete的用法
new用来分配堆区空间,有两种:
1.申请单个空间
new+数据类型;
或:
new+数据类型(初值);
2.申请连续空间
new[ 内存单元个数 ];
注意:new返回的是对应的地址,所以要用同类型的指针接收。
当new申请一个多维数组变量或者数组对象时,会返回一个指向数组第一个元素的地址。
delete用来释放new创造的堆区空间
delete a;//a为接收new返回的地址的指针
delete [内存单元个数] b;//b为接收new开辟的数组的指针
注意:new开辟用的语法和delete释放用的语法应对应,如下文:
new <--> delete
new [] <--> delete []
更多的关于delete与new的用法详解可见