8. 堆、栈与内存管理
1. 栈(stack)和堆(heap)
stack,是存在与某作用域(scope)的一块内存空间(memory space),例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。
在函数本体(function body)内声明的任何变量,其所使用的内存块都取自上述stack.
Heap, 所谓system heap, 是指由操作系统提供的一块 global 内存空间,程序可动态分配(dynamic allocated)从其中获得若干区块(blocks).
当离开作用域{}的时候,c1的生命自然就消失了, 即从栈中获得的内存,离开作用域的时候会自动释放。
当离开作用域{}的时候,动态分配的内存不会消失,即从堆中动态取得的内存不会自动消失,需要手动释放(delete 掉)。
c1所占用的空间来自stack,它就是所谓的栈对象(stack object),其声明在作用域(scope)结束之际结束。这种作用域内的对象(object),又叫做local object, auto object, 因为它会被自动清理(意思是析构函数被自动调用)。
2. 静态对象
一个对象前面加上 static 修饰符后,c2既变成所谓的静态对象(static object),其生命在作用域(scope)结束之后仍然存在,直到整个程序的结束。
如果你需要静态对象的这种特性,就要这样定义静态对象。
3. 全局对象
定义在任何作用域或者说大括号之外的对象。
一个对象的存在和消失取决于构造函数和析构函数何时被调用。
c3就是所谓的global object,其生命在整个程序结束之后才结束,你也可以把它视为一种static object,其作用域是整个程序。
4. heap object的生命周期
A:p所指向的便是heap object(堆对象),因为是动态从操作系统某个地方分配的内存,其生命周期在它被delete之际(此时默认析构函数或者手写析构函数被调用)结束。
B:会出现内存泄露(memory leak),因为当作用域结束后,p所指向的heap object仍然存在,但是指针p的生命却结束了,作用域之外再也看不到p,也就没机会delete p.
5. array new一定要搭配array delete,在使用指针新建字符数组的情况下,在手动释放内存的时候,如果delete[] p;写成了delete p;会造成内存泄露。
21h代表一个16进制的数(32);
3代表新创建了3个字符串;