- (一)new/delete用法
- (1)申请/释放 单独 堆区空间
- (2)申请/释放 连续 堆区空间
- (3)单独空间 申请并初始化
- (二)堆区二维数组的开辟
- (1)数组指针方式
- (2)指针数组方式
- (三)new和malloc区别
- (四)new创建对象特点
- (五)总结
基础语法:
//开辟空间 //单独堆区空间 类型* 指针变量名 = new 类型(初始值); //连续堆区空间 类型* 指针变量名 = new 类型[个数]; //释放空间 //单独堆区空间 delete 指针变量名; //连续堆区空间 delete[] 指针变量名;(1)申请/释放 单独 堆区空间
int* p = new int; //只进行申请堆区空间sizeof(int)大小 *p = 20; //对申请的空间赋值 delete p; //将p指向的空间还给系统 p = NULL; //将p变量的内容置空(2)申请/释放 连续 堆区空间
int* p = new int[10]; //申请10个int类型的堆区空间 delete[] p; //将p指向的连续空间还给系统 p = NULL; //将p 的值置空(3)单独空间 申请并初始化
int* p = new int(10); //将申请的int类型的堆区空间,初始化为10 delete p; //将p指向的空间还给系统 p = NULL; //将p变量的内容置空(二)堆区二维数组的开辟 (1)数组指针方式
//p是数组指针,指向的堆区数组有两个子元素p[0][10]和p[1][10]; //p[0][10]和p[1][10]又各自有十个int类型的子元素 int (*p)[10] = new int[2][10]; //new了一个二维数组, 去掉最左边那一维[2], 剩下int[10], 所以返回的是一个指向int[10]这种一维数组的指针int (*)[10]. //释放 delete[] p;
使用测试:
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[] p;
return 0;
}
结果:
//让指针数组中的每个指针都指向一个连续的堆区空间
//int** p = (int**)malloc(sizeof(int*) * 10);
//开辟
int** p = new int*[2];
for(int i = 0; i < 2; i++)
{
p[i] = new int[10];
}
//释放
for(int i = 0; i < 2; i++)
{
//p[i]指向的空间是连续的空间,所以使用delete[]
delete[] p[i];
}
//p有两个子元素都是int*类型
delete[] p;
(三)new和malloc区别
- C语言malloc申请失败返回NULL。可由程序员手动处理。C++new失败,直接抛出异常。
不抛出异常的处理:
#include(四)new创建对象特点using namespace std; int main() { //申请失败,返回NULL给p,不抛出异常 int* p = new(nothrow) int; return 0; }
- new创建对象需要指针接收,一处初始化,多处使用
- new创建对象使用完需delete销毁
- new创建对象直接使用堆空间,而局部不用new定义对象则使用栈空间
- new对象指针用途广泛,比如作为函数返回值、函数参数等
- new 类型() 在堆区申请 类型的大小空间,使用圆括号中的值,对该空间进行初始化;
- new 类型[] 在堆区申请 连续 类型的空间,空间大小sizeof(类型) * []中的个数, 并使用默认的构造函数进行初始化。
这里主要说明new/delete的基本用法,至于malloc和new的具体区别,请关注后续文章。



