P7栈、堆和内存管理
栈Stack
存在于某作用域的内存空间,当调用函数时,函数本身会形成一个stack来放置它所接收的参数以及返回地址,当离开该作用域时,该stack空间自动释放
堆Heap
new关键字进行内存动态分配的内部细节
Complex *pc = new Complex(1,2);
在编译器下面转化为三个步骤
1.使用函数“operator new”分配内存
Void* mem = operator new(sizeof (Complex) );
“operator new”函数内部调用malloc(n);
2.指针类型转型
pc = static_cast<Complex*>(mem);
3.调用构造函数
pc ->Complex::Complex(1,2);
Delete关键字进行内存动态分配的内部细节
String* ps = new String("Hello");
...
Delete ps;
在编译器下面转化为两个步骤
1.调用析构函数
String::~String(ps);
2.使用“operatpr delete”函数释放内存
Operator delete(ps);
“operator delete”函数内部调用free(n);
动态分配所得的内存块
new
1.上下有两个cookie 各占4个byte,最后一位只能为0或1,0代表未使用,1代表正在使用,从第二位开始代表该内存块大小
2.内存块大小要以16byte为倍数
array new( new[] )
在分配的内存前面增加4个byte记录分配的数组个数。