1.内存分配介绍
在c++中,内存分成5个区,分别是 堆,栈,自由存储区,全局/静态存储区和常量存储区
栈,函数内局部比那里的存储单元都可以在栈上面创建,栈内存奉陪运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限;
堆,就是那些有new分配出来的内存块,每一个new对应一个delete,如果程序员忘记释放掉,那么程序结束之后,由操作系统自动收回(注:内存泄漏);
自由存储区,就是那些由malloc等分配的内存块,与堆相似,但有些不同,malloc对应free,自由存储区一般用来存储c方式的内存;
全局/静态存储区,顾名思义,这部分区域是用来存储全局变量和静态变量的;
常量存储区,这是一块比较特殊的存储区,他们里面存储的是常量,不允许被修改
2.常见的内存错误
*内存分配未成功,却使用了它。这种问题经常出在新手身上,因为他们没有意识到,内存会分配不成功,常见的解决办法就是在使用内存之前判断指针是否为空
*内存分配成功,但未初始化就使用了它。这种问题可能是没有初始化的概念,或者是认为内存的默认值全为0,常见的解决方法就是 初始化
*忘记释放内存,造成内存泄漏。动态内存申请和释放的时候必须配对,malloc对free new对delete
*内存已分配,并且初始化,但是下标越界。这种情况经常会出现在,数组使用上面。常见的解决方法是使用stl
*内存已经释放,但是还再继续使用。这种问题可能是调用关系复杂,以至于难以发现是否已经释放了内存;或者是return语句指向了 已经释放的指针或者引用,亦或是释放内存后,没有置NULL,造成野指针
3.简单的内存管理和垃圾回收机制
在c++中,有2种比较简单的内存管理方式,一种是使用智能指针,另外一种是使用内存池。
*智能指针,通常是指引用技术型的智慧指针(auto_ptr除外),将一个计数器与指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象
*内存池,内存池是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升,也在一定程度上,解决内存碎片的问题