经验分享 从C到C++(一)(1)(3)
5. new delete
许多C用户肯定不会忘记alloc()和free()函数族,它们曾经为动态内存分配与释放的操作做出了很大的贡献,如:
- char *cp = malloc(sizeof(char));
- int *ip=calloc(sizeof(int) 10);
- free(ip);
- free(cp);
C++允许用户使用这些函数,但它同时也提供了两个类似的操作符new和delete,它们分别用来分配和释放内存,形式如下:
- p = new TYPE;
- delete p;
因此以上的cp操作可改版为:
- char*cp=new char;
- delete cp;
new delete操作符同样亦可作用于C中的结构变量,如:
- struct COMPLEX*cp = new struct COMPLEX;
- delete cp;
当不能成功地分配所需要的内存时,new将返回NULL.对于字符型变量可以如下初始化:
- char ch('A'); //char ch='A'
对应地,new可以同时对变量的值进行初始化,如:
- char p=new char ('A‘); //cp='A' new
不需要用户再使用sizeof运算符来提供尺寸,它能自动识别操作数的类型及尺寸大小,这虽然比malloc)函数聪明不了多少,但起码使用起来会比它方便得多。当然,正如calloc()函数,new也可以用于数组,形式如下:
- p = new TYPE[Size] ;
对应的内存释放形式:
- delete [] p;
同理首例中ip操作可以改版为:
- int * ip=new int[10];
- delete [] ip;
用new分配多维数组的形式为:
- p = new TYPE [c0] [c1]…… [cN];
从来没有太快活的事情,例如以下使用非法:
- int***ip2=(int***)new int[m] [n][k];
- //error. Constant expression required int***ip 1=(int***)new int[m][2][81; //ok
C++最多只允许数组第一维的尺寸(即c0)是个变量,而其它的都应该为确定的编译时期常量。使用new分配数组时,也不能再提供初始值:
- char*String =new char[ 20] ("Scent of a Woman");
- //error: Array allocated using 'new' may not have an initializer
- 上一篇:C++入门之谈前置++与后置++的区别
- 下一篇:经验分享 C++编程技巧