一.new 的几种基本用法
1.创建一个动态变量
int *p;
p=new int; //new int 操作时的在堆区产生一个int型的动态变量,结果为该动态变量的地址(或指针)。
*p=1;
2.创建一个一维n位动态数组
int *p;
int n;
p=new int[n]; // 操作在程序的堆区中产生一个动态的一维数组,数组元素的类型是int,返回值为数组的首地址。
3.创建一个n*20的动态数组
int (*q)[20]; //定义q为一个指向20个int型元素所构成的一维数组的指针。 等价于 typedef int A[20]; A* q;
q=new int[n][20]; //上面这一段会产生error,因为 无法从int (*)[20]转化为 int *;
4.创建一个m*n的动态数组
int m,n;
cin>>m>>n;
int **p = new int*[n];
for (int i=0; i<n; ++i)
p[i] = new int[m]; //定义一个n*m的二维动态数组
二.malloc的用法
1.malloc在 cstdlib中声明,在程序的堆区中分配一块大小为size的内存空间,并返回该内存空间的的首地址。
2.malloc 函数原型:
void *malloc(unsigned int size);
3.具体使用
int *p;
p=(int *)malloc(sizeof(int)); //创建一个int型的动态变量
double *q;
int n;
q=(double *)malloc(sizeof(double)*n); //创建一个由n个double型元素组成的一位动态数组
typedef int A[20];
int *q=(int *)malloc(sizeof(int)*20); //创建一个n行,20列的动态二维数组变量
三.new与delete的区别
1.new自动计算所需分配空间的大小,delete需要显式的指出。
2.new自动返回相应类型的指针,delete需要做强制类型的转化。
3.如果创建的是动态对象,new会去调用相应对象类的构造函数,而malloc不会。
四.动态数组的撤销
1.new创建的delete使之消亡,malloc创建的free使之消亡。
2.delete格式如下:
int *p=new int;
delete p;
int *p=new int[20];
delete[]p;
3.free的格式如下:
int *p=(int *)malloc(sizeof(int));
int *q=(int *)malloc(sizeof(int)*20);
free(p);
free(q);
4.delete与free的区别
如果p指向的是对象(或对象数组),则delete p(或delete []p)回去调用对象类的析构函数,而free不会。
5.悬浮指针(dangling pointer)
撤销后,c++编译程序一般不会把指向它的指针变量的值赋为NULL,这样就产生了一个悬浮指针,它指向一个无效的空间。在通过这个悬浮指针来使用相应的动态变量就会产生语义错误。
6.内存泄漏(memory leak)
如果不去撤销它,而指向了别的地方,那个空间就会浪费掉。