CPP笔记
C++的内存模型
1.栈区 stack
由编译器自动分配释放,存放函数的参数值、返回值和局部变量。在程序运行过程中实时分配和释放,栈区由操作系统自动管理。栈由系统自动分配,速度较快。但程序员是无法控制的。
2.堆区 heap
堆是由malloc/new分配的内存块,使用free/delete来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。
堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。
由此可见,堆获得的空间比较灵活,也比较大。
3.全局区
可以划分为静态区和常量区。静态区存放有全局变量和静态变量(用static声明的变量),静态区的内存在程序全部结束之后,才会被释放。常量区存有字符串型常量以及const修饰的全局变量,常量区的内容在运行的期间是不能够被改变的
4.代码区
存放CPU执行的机器指令,代码区是可共享,并且是只读的。
C++关键字new,delete
-
简介:
new是C++的一个关键字,同时也是一个操作符。new的过程:当使用关键字new在堆上动态创建一个对象时,有三个步骤,首先获得一块内存空间、然后调用构造函数、最后返回对象指针。
-
new基本语法:
int *p = new int(10); int* arr = new int[10]; Person* pa = new Person(3); -
内存释放delete
根据变量地址的数据类型来释放内存delete p; delete[] arr; delete pa; -
new和delete都可以进行运算符重载,实现自己想要的效果。
C++的引用
-
作用:给变量起别名
语法:数据类型 &别名 = 原名int a = 10; int& b = a; -
注意事项:引用必须初始化,如
int& b = a;这样初始化;初始化以后不可以改变,b不能在引用到其他的内存(变量上)。int a = 10; int& b = a; int c = 12; b = c;//此句并没有更改b引用到c,而是将c的值12赋到b上,最后啊a,b,c均为12 -
引用做函数参数:使用引用修饰实参,避免使用指针修饰实参。
void swap(int &a, int &b) { int c = a; a = b; b = c; }//使用引用完成交换 -
引用做函数的返回值:
-
尽量不要返回局部变量的引用
int& test01() { int a = 100; return a;//避免返回a这样的局部变量 } -
函数作为左值
int& test02() { static int a = 100; return a;//避免返回a这样的局部变量 } //调用 int& ret = test02(); test02() = 1000; //最后ret编程1000
-
-
常量引用:修饰形参,防止误操作
void test(const int& a) -
引用的本质:指针常量
int &b = a;//等同于 int *const b = &a;

浙公网安备 33010602011771号