1.new 与delete
C++中应该使用配套的new和delete,规则:如果你在调用new时使用了[ ],则你必须在调用delete时也使用[ ],如果你在调用new的时候没有使用[ ],那么你也不应该在调用delete时使用[ ]。如:
string *strPtr1=new string;
string *strPtr2=new string[10];
...
delete strPtr1; //删除单一对象
delete [] strPtr2; //删除整个对象数组
注意:如果一个指针是空指针,即null指针,不能对它使用delete删除。
2.内存泄漏
情况一:如果用动态编码机制申请了一个动态变量,但是之后不需要使用这个动态变量时没有用delete;
情况二: 把一个动态编码的地址放入了一个指针变量,而在此变量没有delete之前,又让指针指向了另外一个 动态变量,这样原来那块空间就丢失了。堆管理器就认为你还在继续使用它们,而你现在已经不知道原来的动态变量所在地址。
对于一些小程序内存泄漏可能不重要,但是对于需要几天甚至半个月才能运行完的程序,如果存在内存泄漏,这样程序最终可能会耗尽所有内存,直至崩溃。
3.动态二维数组
C++不支持直接申请动态二维数组。申请一个动态的二维数组需要程序员自己解决。
最简单的方法是将二维数组转换成一维数组,比如a[3][4]的二维数组,申请一个a[12]的一维数组,如果要访问二维数组的第i行第j列的元素时,通过4*i+j实现访问二维数组中的元素,这种方法的缺点是不能直接通过二维数组的下标变量的形式访问二维数组的元素。
其实a[3][4]是三个元素组成的整型指针,其中的每个元素如a[0]指向一个数组,这个数组又包含4个元素,也就是指向整型的指针的指针。
例子:申请动态二维数组
#include <iostream>
using namespace std;
int main()
{ int **a, i, j, k = 0; //a是动态数组的名字
a = new int *[3]; //申请指向每一行首地址的指针
for (i = 0; i < 3; ++i) //为每一行申请空间
a[i] = new int[4];
for (i = 0; i < 3; ++i) //为动态数组元素赋值
for (j = 0; j < 4; ++j)
a[i][j] = k++;
for (i = 0; i < 3; ++i) { // 输出动态数组
cout << endl;
for (j = 0; j < 4; ++j)
cout << a[i][j] << '\t';//'\t'表示制表符,即一个Tab键的距离
}
for (i = 0; i < 3; ++i) // 释放每一行
delete [] a[i];
delete [] a; // 释放保存每一行首指针的数组
return 0;
}