(一)new/delete用法
基础语法:
1 2 3 4 5 6 7 8 9 10 11
|
类型* 指针变量名 = new 类型(初始值);
类型* 指针变量名 = new 类型[个数];
delete 指针变量名;
delete[] 指针变量名;
|
(1)申请/释放 单独 堆区空间
1 2 3 4 5
| int* p = new int; *p = 20; delete p; p = NULL;
|
(2)申请/释放 连续 堆区空间
1 2 3 4
| int* p = new int[10];
delete[] p; p = NULL;
|
(3)单独空间 申请并初始化
1 2 3 4
| int* p = new int(10);
delete p; p = NULL;
|
(二)堆区二维数组的开辟
(1)数组指针方式
1 2 3 4 5 6 7
|
int (*p)[10] = new int[2][10];
delete[] p;
|
使用测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int main() { int(*p)[10] = new int[2][10];
int(*s)[10] = p; for (int i = 0; i < 2; i++) { int* q = (int*)s; for (int j = 0; j < 10; j++) { q[j] = j; cout << q[j] << " "; } s++; cout << endl; }
delete[10] p;
return 0; }
|
结果:
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
(2)指针数组方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
int** p = new int*[2]; for(int i = 0; i < 2; i++) { p[i] = new int[10]; }
for(int i = 0; i < 2; i++) { delete[] p[i]; }
delete[] p;
|
(三)new和malloc区别
- C语言malloc申请失败返回NULL。可由程序员手动处理。C++new失败,直接抛出异常。
不抛出异常的处理:
1 2 3 4 5 6 7 8
| #include <iostream> using namespace std; int main() { int* p = new(nothrow) int; return 0; }
|
(四)new创建对象特点
- new创建对象需要指针接收,一处初始化,多处使用
- new创建对象使用完需delete销毁
- new创建对象直接使用堆空间,而局部不用new定义对象则使用栈空间
- new对象指针用途广泛,比如作为函数返回值、函数参数等
(五)总结
new 类型()
在堆区申请 类型的大小空间,使用圆括号中的值,对该空间进行初始化;new 类型[]
在堆区申请 连续 类型的空间,空间大小sizeof(类型) * []中的个数, 并使用默认的构造函数进行初始化。
这里主要说明new/delete的基本用法,至于malloc和new的具体区别,请关注后续文章。