今天面试一头雾水,学习C++的时候没怎么了解C++的内存机制,教科书上竟然没有!What?老师上课只是提了一下,没有说的很细,而且时间过去了好长时间,今天面试的时候面试官问我:”说一下你对C++内存机制的理解!“噗,一下慌了,只想起来堆,栈,还有全局静态,面试官笑了给我简单讲了一下还。回去之后赶紧仔细查阅资料,虽然面试凉了,但是却让我知道我还有哪里不足,赶紧给自己补习。总结如下,如有不妥之处,欢迎拍砖:
内存分配常规方式三种:
一.从静态存储区域分配:这块内存在编译的时候就已经分配好了,而不是编译过程才分配,而且会一直存在于程序运行期间,例如全局变量,还有static定义的变量。
二.从栈上创建: 在函数运行的时候,那些局部变量的存储单元一般都建立在栈上,而且在函数执行结束时自动释放,效率很高,但是存储的容量有限,当然也可以修改。
三.从堆上创建:我们也称之为动态内存分配,在程序运行中由程序员用malloc或new主动创建的内存,我们都建立在堆上,而且在程序结束的时候,也需要程序员通过free或delete主动释放内存,使用灵活,但是如果使用不当会出现内存泄漏的问题,出现堆内碎块。
C++中程序占用五种内存:
一.堆区: (heap)一般由程序员主动申请主动释放(new,delete),但是如果程序员没有主动释放,那最后将由OS(操作系统)回收,分配方式类似数据结构中的链表。
二.栈区:(stack) 一般由编译器主动分配和释放,无需程序员释放,一般用来存放函数的局部变量,函数参数,返回数据,返回地址等,分配方式类似数据结构中的栈。
三.全局区:(静态区,static)一般用来存放全局变量,静态变量,常量,在程序结束的时候由系统释放。
四.自由存储区:一般由程序员用malloc()/calloc()/realloc()分配空间,由free()释放,但如果程序员忘记free()了,则会造成内存泄漏,程序结束时可能会有操作系统回收,这里与C的堆机制对应。
五.常量存储区:它是用来存放那些不可以改变的常量,程序结束的时候由操作系统释放
(c和c++内存机制有些地方还是有些区别)
顺便提一下一般程序内存空间大概分为:
一.代码区:(code area)
二.全局数据区:(data area)
三.堆区:(heap area)
四.栈区:(stack area)
代码案例:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
const int a=10; //常量存储区
int p = 0; // 全局变量全局初始化区
char* p1; // 全局变量全局未初始化区
int main() {
int p2; // 栈区
char p3[] = "barrett"; // 栈区
char* p4; // 栈区
char* p5 = "barrett"; //barrett\0在常量区,p3在栈区
static int p6 = 0; // 全局/静态初始化区
char* p7 = (char*) malloc(10);
char* p8 = (char*) malloc(20); // 分配得来的10和20字节在自由存储区
char* p9 = new char[20]; // 分配得来的20字节在堆区
return 0;
}