利用C++语言进行程序开发,如果内存管理不当将会出现内存泄露等问题,因此C++内存管理式C++程序开发中非常重要的环节。
在C++中,内存分为:堆、栈、全局/静态存储区和常量存储区。
堆:由new分配的内存块,内存释放由程序员控制,一个new要对应一个delete。如果程序员没有释放,则程序运行结束后操作系统会自动回收。C语言提供的动态内存分类函数为malloc()和free(),这些函数在运行时从堆(也称自有内存)中分配存储单元。
栈:函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元被自动释放。效率高但是空间有限。
全局/静态存储区:全局变量和静态变量。
常量存储区:存放常量,不能修改。
堆和栈的区别
void f() { int* p=new int[5]; }
p在栈内存,new出来的空间在堆内存。释放内存delete []p.
区别:
(1)管理方式不同。栈由编译器自动管理;堆由程序员控制,容易memory leak;
(2)空间大小不同。32位操作系统堆内存可以达到4G空间。栈空间较小;
(3)能否产生碎片不同:对于堆,频繁的new/delete会造成内存空间不连续,从而造成大量的碎片,使程序效率降低。对于栈,不存在这个问题,因为栈是先进后出的队列,一一对应。
(4)生长方向:堆向上生长,也就是向着内存地址增加的方向;栈向下
(5)分配方式:堆是动态分配的,没有静态分配的堆。栈有两种分配方式:静态和动态。静态分配由编译器完成,如局部变量的分配。动态分配由alloca函数进行分配。
(6)分配效率不同:栈效率比较高。堆效率低。