栈 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,有没有[]不影响整块删除,但不加[]会少调用析构函数,数组元素的除了第一个外的分配的内存空间没删掉,因此内存泄漏不是数组这个位置,而是数组元素的成员分配的空间。