使用new来分配空间
-
在C语言中,可以用库函数malloc()来分配内存;在C++中仍然可以这样做,但在C++中使用new运算符
-
我们只用告诉new,需要为哪种数据类型分配空间,new将找到一个长度正确的内存块(根据类型来确定需要多少字节的内存),并返回该内存块的地址,然后我们需要将该地址赋给一个指针,如:
int * pn = new int;
该情况下,只能通过指针进行访问。
我们说pn指向一个数据对象(指的是为数据项分配的内存块),该数据对象可以是结构,也可以是基本类型
-
使用这种方式的好处是,我们对程序在管理内存方面有更大的控制权。
-
new是从被称为堆(heap)或自由存储区(freee store)的内存区域分配内存
使用delete释放内存
-
delete使得new在使用玩内存后,能够将其归还共给内存池
-
使用delete时,后面要加上指向内存块的指针,如:
int * ps = new int; ... delete ps;
使用new来创建动态数组
-
如果通过声明来创建数组,则在程序被编译时将它分配给内存空间,不管我们是否使用数组,数组都在哪里,占用了空间
-
但是在使用new时,如果在运行阶段需要数组,则创建它,如果不需要则不创建,还可以在运行时选择数组的长度。
-
创建方法:
int * psome = new int [10]; ... delete [] psome;
这里的psome指向的时数组的一个元素
-
我们还可以使用数组名的方式来使用指针名
部分代码:
int * p = new int [3]; p[0] = 1; p[1] = 2; p[3] = 3; cout << p[1] << "\n"//结果为2 p = p + 1; cout << p[1] << "\n"//结果为3 //这里将p加1后导致它指向第2个元素而不是第1个 p = p - 1; delete [] p; //将它减1后,指针将指向原来的值,这样程序便可以给delete[]提供正确的地址。
new和delete在使用时需要的注意事项
- 不要使用delete来释放不是new分配的内存
- 不要使用delete释放同一个空间两次
- 如果使用==new[]为数组分配内存,则应该是使用delete[]==来释放
- 对空指针应用delete是安全的