C++ 栈、堆与内存管理

栈 stack

存在于某作用域的一块内存空间。

例如当调用函数时,函数本身会形成一个stack用来放置它所接受的参数,以及返回地址

函数本体内声明的任何变量,所使用的内存块都取自上述stack。

堆 heap

是由操作系统提供的一块global内存空间,程序可动态分配 从某中获得若干区块

c1 是生命在作用域结束的时候结束,会被自动清理

p在被delete后才结束

new:先分配空间,再调用构造函数

Complex* pc = new Complex(1,2);

编译器会转化为

Complex *pc;

void* mem = operator new(sizeof(Complex)); //分配内存,其内部调用了malloc(n)
pc = static_cast<Complex*>(mem); //转型
pc->Complex::Complex(1,2);    //构造函数

delete:先析构,再释放内存

delete ps;

转化为

String::~String(ps); //析构函数
operator delete(ps); //释放内存,内部调用free(ps);

先清除内部的m_data,再清除ps本身

内存管理

第一列调试模式,第二列release模式

一格4字节,complex有实部虚部占8字节,但上面的32字节,下面的4字节,以及2个红色的格子cookie,总共52字节,但要16字节的倍数,所以64字节(因为内存对齐?),看起来浪费了很大的空间,但是以后操作系统回收空间可能需要这些内容。

cookie记录长度,40h表示64,借用最后一位,1表示操作系统给出去,0表示收回去

16字节对齐,则最后4位都是0,所以可以借用1位。

release模式则是16字节。

不同编译器分配的内存不同

数组分配

vc中会额外给4字节记录长度,这里记录了3。

 其他编译器不清楚。

array new 要搭配 delete[]

不然会造成内存泄漏

delete删掉这块时看cookie,有没有[]不影响整块删除,但不加[]会少调用析构函数,数组元素的除了第一个外的分配的内存空间没删掉,因此内存泄漏不是数组这个位置,而是数组元素的成员分配的空间。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值