一、内存管理
1.内存分配方式:
在C++中,内存分为五个区:堆、栈、*存储区、全局/静态存储区和常量存储区。
栈:在执行函数时。函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,但可分配内存有限。
堆:由new分配的内存块,编译器不释放,由应用程序控制。一般一个new对应一个delete,如果未释放,程序结束时系统自动回收。
*存储区:由malloc等分配的内存块,与堆相似,用free释放。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中。
常量存储区:特殊的存储区,存放常量,不允许修改。
malloc()函数,动态分配内存空间:malloc()函数在堆分区分配一块指定大小的内存空间,用来存放数据,这块内存在函数执行结束后不会被初始化,它们的值是未知的。
函数原型:void* malloc (size_t size);返回值:分配成功返回指向该内存的地址,失败则返回 NULL。
2.堆和栈的区别:
2.1管理方式:栈由编译器自动管理,无需手动控制。
堆由程序员控制,容易产生memory leak。
2.2空间大小:栈的默认大小一般不会超过1M,但堆可以达到4G的空间。
2.3碎片问题:对于堆频繁的new/delete会造成内存空间的不连续,造成大量碎片,降低程序效率。栈没有碎片。
2.4生长方向:对于堆来说,生长方向向上,向着内存地址增长的方向。
对于栈来说,生长方向向下,向着内存地址减小的方向。
2.5分配方式:堆都是动态分配的,栈有动态分配和静态分配。
2.6分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址。压栈出栈都有专门的指令执行,效率比较高。
堆是C++函数提供的,机制复杂,所以效率低。