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;      //引用可以直接参与表达式运算

posted @ 2011-10-26 11:28  玻璃城市  阅读(1302)  评论(0编辑  收藏  举报