内存管理
1、内存分配
C++中,内存分为5部分,栈区、全局/静态变量区、常量区、堆区还有自由存储区,它们存储的数据如下
堆区:存储用new关键字申请的内存,需要程序员用delete手动释放
自由存储区:存储用malloc申请的内存,需要用free手动释放
栈区:存储局部变量、函数参数。栈的内存分配内置于CPU指令集中,效率高但是容量有限
全局/静态存储区:存储全局变量、静态变量
常量区:存储常量,不能修改
2、堆栈的区别
管理上:栈由编译器自动管理;堆需要手动释放,不断申请释放会是内存块不连续,会产生内存碎片
生长方式:堆是内存地址递增,栈是内存地址递减,栈是容量有限的
效率上:栈有专门的指令,计算机底层提供支持,堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
3、内存释放
char *p; delet p; char[] p; delete[]p,这样才可以释放数组内存 释放后p仍然指向那块释放掉的内存,所以要p=NULL
malloc申请的内存需要手动初始化,释放前要手动销毁
new创建的对象,new时初始化,delete时销毁
4、内存泄露
手动申请的内存,没有任何指针指向它,它也没法释放掉,那么这块内存就泄露了
野指针
野指针是指向垃圾的指针,也就是指向不合法的内存(没有申请过或者已释放)的指针,不初始化和释放后不NULL就会产生野指针