VC++ (四)动态内存
1、在C++中动态内存分配在堆上,采用new和delete来申请和释放内存空间,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; //引用可以直接参与表达式运算