CPP笔记

C++的内存模型

1.栈区 stack

    由编译器自动分配释放,存放函数的参数值、返回值和局部变量。在程序运行过程中实时分配和释放,栈区由操作系统自动管理。栈由系统自动分配,速度较快。但程序员是无法控制的。

2.堆区 heap

    堆是由malloc/new分配的内存块,使用free/delete来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。

    堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。

由此可见,堆获得的空间比较灵活,也比较大。

3.全局区

    可以划分为静态区和常量区。静态区存放有全局变量和静态变量(用static声明的变量),静态区的内存在程序全部结束之后,才会被释放。常量区存有字符串型常量以及const修饰的全局变量,常量区的内容在运行的期间是不能够被改变的

4.代码区

   存放CPU执行的机器指令,代码区是可共享,并且是只读的。

C++关键字new,delete

  1. 简介:

    new是C++的一个关键字,同时也是一个操作符。

    new的过程:当使用关键字new在堆上动态创建一个对象时,有三个步骤,首先获得一块内存空间、然后调用构造函数、最后返回对象指针。

  2. new基本语法:

    int *p  = new int(10);
    int* arr  = new int[10];
    Person* pa = new Person(3);
    
  3. 内存释放delete
    根据变量地址的数据类型来释放内存

    delete p;
    delete[] arr;
    delete pa;
    
  4. new和delete都可以进行运算符重载,实现自己想要的效果。

C++的引用

  1. 作用:给变量起别名
    语法:数据类型 &别名 = 原名

    int a = 10;
    int& b = a;
    
  2. 注意事项:引用必须初始化,如int& b = a;这样初始化;初始化以后不可以改变,b不能在引用到其他的内存(变量上)。

    int a = 10;
    int& b = a;
    int c = 12;
    b = c;//此句并没有更改b引用到c,而是将c的值12赋到b上,最后啊a,b,c均为12
    
  3. 引用做函数参数:使用引用修饰实参,避免使用指针修饰实参。

    void swap(int &a, int &b)
    {
    	int c = a;
    	a = b;
    	b = c;
    }//使用引用完成交换
    
  4. 引用做函数的返回值:

    • 尽量不要返回局部变量的引用

      int& test01()
      {
      	int a = 100;
      	return a;//避免返回a这样的局部变量
      }
      
    • 函数作为左值

      int& test02()
      {
      	static int a = 100;
      	return a;//避免返回a这样的局部变量
      }
      //调用
      int& ret = test02();
      test02() = 1000;
      //最后ret编程1000
      
  5. 常量引用:修饰形参,防止误操作

    void test(const int& a)
    
  6. 引用的本质:指针常量

    int &b = a;//等同于 int *const b = &a;
    
posted @ 2020-07-11 23:32  otamp  阅读(41)  评论(0)    收藏  举报