C++ 学习笔记 堆、栈与内存管理
Stack栈,是存在与某作用域(scope)的一块内存空间(memory space)。例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。
在函数本体(function body)内声明的任何变量,其所使用的内存块都取自上述stack。
Heap堆,或称system heap,是指由操作系统提供的一块global内存空间,程序可动态分配(dynamic allocated)从某中获得若干区块(blocks)。
int main() { complex c1(2, 1); complex* p = new complex(1,3); return o; }
c1所占用的空间来自stack;
Complex(3)是个临时对象,其所占用的空间乃是new自heap动态分配而得,并由p指向。
指针p所占用的空间也是来自stack;
【注】内存泄漏:当指针p的生命结束时,却没有delete p指针,那么动态分配的内存没有被释放,就会出现内存泄漏(memory leak)

【拓展】--- new和delete的原理
array new一定要搭配 array delete
(一)new:先分配内存memory,再调用构造函数ctor
complex* p = new complex(1,3);
上述代码编译器转换为:
Complex *pc; void* mem = operator new( sizeof(Complex) ); // Complex有两个double类型的值,所以分配的内存大小为8字节,其内部调用molloc(n) pc = static_cast<Complex*>(mem); // 类型转换 pc->Complex::Complex(1, 2); // 构造函数
(二)delete:先调用析构函数dtor,再释放内存memory
String* ps = new String("Hello"); ... delete ps;
编译器转化为:
String::String(ps); // 析构函数 operator delete(ps); // 释放内存,其内部调用free(ps)
浙公网安备 33010602011771号