• VC++ (四)动态内存


    1、在C++中动态内存分配在堆上,采用newdelete来申请和释放内存空间,C++运行环境不会自动释放内存空间。如果申请了内存空间不再使用,且未释放将会造成内存泄露。为数组动态分配内存的语法如下:

      char * pStr = new char[20];  //申请20个字节的字符串数组

      delete [] pStr;            //释放数组,方括号是为了指出要释放的是一个数组

    2、CLR的动态内存分配以不同的方式工作,CLR维护着独立于本地C++堆的、自己的内存堆。当不再需要在CLR堆上分配的内存时,CLR将自动将其删除。所以我们不需要再为CLR编写的程序中使用delete运算符。在C++/CLI程序中,使用gcnew运算符,而非new运算符分配内存。在CLR中使用跟踪句柄来指向内存数据或类对象,而非C++中的指针。跟踪句柄采用^放在某个类型名称的后面进行声明:

      String^ pStr = gcnew String("这是一个字符串。");

      String^ pStr = "这是一个字符串。";

      pStr = nullptr;  //将句柄指向一个空值,注意不能使用NULL

    使用跟踪句柄需要先解除引用,其运算符号与指针相同,使用*运算符,如下:

      int^ val = 99;

      int result = 2 * (*val) + 15;

    同指针一样,如果跟踪句柄指向一个内存数据,通过*运算符也可以进行赋值运算,如下:

      *val = 100;  //由99变为100

    注意:如果跟踪句柄指向空(nullptr),则不能进行赋值运算。

    跟踪句柄也可以用于定义数组,如下:

      array<char>^ pStr = gcnew array<char>(20); //申请20个字节的字符串数组

    3、引用在许多方面类似于指针,但二者不是一个概念,引用是指对另外一个变量的别名。由于引用是变量的别名,所以声明引用时必须指出对应的变量,且一旦定义就不能再修改引用,使其表示另外一个变量。引用使用&运算符,如下:

      long number = 0;     //定义一个变量

      long& rnumber = number;  //定义变量对应的引用

      long* pnumber = &number;  //定义变量的指针

    引用与指针的最大区别在于:指针需要*运算符解除引用才能参与到表达式中,而引用可以直接使用,使得引用就像是已经被解除引用的指针,如下:

      *pnumber += 10;      //指针需要解除引用后才能参与表达式运算

      rnumber += 10;      //引用可以直接参与表达式运算

  • 相关阅读:
    Android安全机制
    service不死之身
    图片加载机制比较
    handler机制面试
    SharedPreferences封装类
    文字太长自动缩小
    ANR
    onCreate源码分析
    线程池的启动策略
    Oauth认证协议
  • 原文地址:https://www.cnblogs.com/ChinaEHR/p/2224916.html
Copyright © 2020-2023  润新知