C++学习(3)

stack(栈) heap堆

Stack,是存在于某作用于(scope)的一块内存空间(memory space)、例如当你调用函数,函数本身即会形成一个人stack用来放置它所接受的参数。以及返回地址。栈是局部的

在函数本身(function body)内声明的任何变量,其所使用的内存块都取自上述stack.

Heap堆,或者system heap ,是指由操作系统提供的一块global没存空间。程序可动态分配(dynamic allocated)从某种获得若干块(block)

c1所占用的空间来自于栈。

*p是个临时对象,所占用的空间来自于堆。生命周期结束不会自动释放,需要自己手动释放内存空间。

Stack object的生命周期:

c1便是所谓stack object,其生命在作用域(scope)结束之际结束。这种作用域内的object,又称为auto object,因为它会被自动清空。

static local objects的生生命期

c2便是所谓static object,其生命在作用域(scope)结束之后仍然存在。直到整个程序结束。

global object的生命周期

c3便是所谓global object,其生命在整个程序结束之后才结束。你也可以把它视为一种static object,其作用域是整个程序。

heap object的生命周期

p所指的便是heap object,其生命在它被delete之际结束。

上面这个程序即会出现内存泄漏(memory leak),因为当作用域结束,p所指的heap object仍然存在,单指针p的声明却结束了,作用域之外再也看不到p(也就没有机会delete p)

new 先分配memory,再调用构造函数

new分成三个步骤:1、分配内存;2、转型。将指针转型为特定类型。3、通过指针调用构造函数。

delete先调用dtor析构函数,再释放内存

delete转化为两个动作:1、调用析构函数;2、释放内存

第一步,析构函数调用delete释放类内的指针。第二步调用delete释放类指针。

动态分配所得的内存块memory block,in VC

new 和delete 是数字new要用数组delete  

new  char[] 搭配 delete[]

delete array调用多次析构函数,不使用delete array只调用一次析构函数。

static静态

静态数据和静态函数

创建多个对象只有一个静态数据,与对象脱离。函数都只有一份。静态函数只能处理静态数据

静态数据在类内声明,静态数据在类的外部进行定义。

静态函数的调用有两种:1、通过对象进行调用;2、通过class name调用。

单例模式 把构造函数放入private中;

单例的改进:如果没有人用单例。单例则不会被创建

class template模板类