内存管理

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就会产生野指针

posted on 2014-12-09 17:35  cxzhi  阅读(100)  评论(0编辑  收藏  举报

导航