7.2 内存分配

摘自:程序员面试笔试宝典

7.2.1内存分配的形式有哪些

C++程序所占用的系统内存:

1.BBS(Block Started By Symbol)存放未初始化的全局变量和静态数据的一块内存,属于静态内存分配。程序结束后,由系统释放。

2.数据段 data segment。存储已经初始化的全局变量,属于静态内存分配。

3.代码段 code segment 用来存放程序执行代码(包括类成员函数和全局函数以及其他函数代码),这部分大小在程序运行前已确定,并且通常为只读,某些架构可以写,在代码段中也可以包含一些只读的常量,如字符串常量,这个段通常的被共享的。

4.堆(heap)堆用来存储进程运行过程中被动态分配的内存段,它的大小并不固定,可动态扩展或缩减。通过new/melloc扩张,delete/free缩减,和数据结构中的堆不是一回事,类似于分配方式类似于链表。

5栈(stack)用来存储程序临时创建的局部变量,除此之外,函数被调用时,其参数也被压入发起调用的进程栈,在调用结束后,返回值也会被存回栈中。栈由编译器分配,存放函数参数值和函数创建的局部变量。


代码段和数据段有明显的分割,但是数据段和堆栈段之间没有。栈是向下增长,堆是向上增长。

堆和栈是两个概念,堆向上增长,栈向下增长。
向下增长的意思是:从栈申请的内存地址会越来越小,
而从堆申请的内存地址会越来越大。

int i1;
    int i2;
    int i3;
    int *p1=new int;
    int *p2=new int;
    cout<<&i1<<endl<<&i2<<endl<<&i3<<endl<<p1<<endl<<p2;

局部静态对象的生存期是从第一次调用该函数到程序结束。

类的静态成员是从该类的第一次调用到程序结束。


7.2.2内存泄露是什么

堆是动态分配内存的,并且可以使用很大的内存,使用malloc/new申请的内存,如何在使用结束后不用free/delete释放,就是造成内存泄露。


7.2.3栈空间的最大值是多少

Windows下默认2M,由于栈向下,所以是连续的空间,而堆是向上,类似于链表,是不连续的,Windows一般小于2G。

通过两种方法可以改变栈的大小。

1.link时使用/STACK指定大小,或者在.def中使用STACKSIZE指定大小。

2.使用控制台命令EDITBIN更改exe的栈空间大小。

linux下默认栈空间是8M。通过命令ulimit-s来设置。


7.2.4 缓存区溢出

缓存区是程序运行时的内存中的一个连续块(理解为自己分配的一个数组,没有边界控制,导致缓冲区其他地址的内容被错写。)。保存了给定类型的数据。随着动态分配内存会出现问题。当超过缓冲区容量时,会覆盖到相邻的内存地址里的内容。导致程序崩溃。

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值