概要
代码区:存放函数体的二进制代码,由操作系统进行管理的
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放,存放函数的参数值,同部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
正文
程序运行前--代码区,全局区
首先代码区和全局区都是在我们程序执行之前生成的,由于操作系统只认识01这样的二进制,所以在我们程序运行起来前会先将程序中的代码转换成计算机认识的二进制,由此生成一个专门存放将我们编写的代码转换成二进制的代码区。而我们在程序中定义的全局变量(在函数体外定义的变量),静态变量(static修饰的变量),常量(被const修饰的全局变量,字符串常量等),为了和在函数体内部定义的局部变量加以区分,会额外开辟一个区域来存放它们,这个区域就叫全局区。
程序运行后--栈区,堆区
栈区和堆区是我们程序运行起来后所产生的,区别主要是栈区空间由操作系统自己开辟释放,而堆区由使用者自己开辟和释放
在上面的程序中我们可以看到虽然局部变量local_p1和local_p2都存放着堆区的地址,但是由于local_p1和local_p2是存放在栈区的局部变量,出了函数体后就销毁,所以local_p1和local_p2本身的地址不相同,但他们所储存的堆区的地址是相同的,并且只要在程序中没有delete关键字就不会被销毁,这种开辟内存并不释放的行为称为内存泄漏,是一种极其危险的行为,因此现在的编译器都很智能,若是发现程序员不释放内存,会自动在程序结束时由操作系统回收,避免出现内存泄漏。
内存泄漏:
是指你向系统申请分配内存进行使用 (new),可是使用完了以后却不归还 (delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。