C++内存机制

今天面试一头雾水,学习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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值