Memory Model
alt text
- Stack
- Local(局部变量) > 函数调用时使用的(运行main( )函数也算调用函数呀) > + 函数调用时的参数,和使用中的临时局部变量都压在栈中
- Heap
- dynamically(动态) > 堆区用于管理动态分配出来的内存 > + 比如malloc,new出来的东西都放在堆区
- data/code
- static(静态) > 具有持久性的变量 > + global vars > + static global vars(与gobal vars的区别是它受到保护不能跨文件声明使用) > + static local vars
Rules of Reference
- 引用在定义的时候必须被初始化,也就是必须说明引用所绑定的对象
>
int& y = x;
> 这里面 y 是引用,x 是对象,所以 y 必须被初始化,也就是必须说明引用所绑定的对象,后面必须有个=
号 > + 唯一的例外是参数表,比如在函数的形参处可以先不用初始化,因为函数被调用的时候,引用变量自然会被绑定 > + 引用变量只要存在就必须有一个绑定对象
- 引用不能被重新绑定,也就是在引用被初始化后,引用不能重新指向另一个对象
- Warning: 引用变量不能绑定一个右值,比如下面:
引用变量不能是赋予一个表达式值的,因为表达式的值是临时的,引用变量不能绑定一个临时量
pointer&reference
Dynamic memory allocation 动态分配内存
- new
- new int;
- new Stash;
- new int[10];
- delete
- delete p;
- delete[] p;
Eg:
- new 和 delete 除了对于一般数据类型的内存操作,更重要可以用于自定义类型的操作:用new的话,除了执行malloc的分配内存的操作,还会执行该自定义类型的构造函数,同样,delete 会先执行析构函数,再回收内存。