栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++】new/delete使用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】new/delete使用

文章目录
      • (一)new/delete用法
        • (1)申请/释放 单独 堆区空间
        • (2)申请/释放 连续 堆区空间
        • (3)单独空间 申请并初始化
      • (二)堆区二维数组的开辟
        • (1)数组指针方式
        • (2)指针数组方式
      • (三)new和malloc区别
      • (四)new创建对象特点
      • (五)总结

(一)new/delete用法

基础语法:

//开辟空间
//单独堆区空间
类型* 指针变量名 = 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;
}

结果:

(2)指针数组方式
//让指针数组中的每个指针都指向一个连续的堆区空间
//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 
using namespace std;
int main()
{
	//申请失败,返回NULL给p,不抛出异常
	int* p = new(nothrow) int;
	return 0;
}
(四)new创建对象特点
  • new创建对象需要指针接收,一处初始化,多处使用
  • new创建对象使用完需delete销毁
  • new创建对象直接使用堆空间,而局部不用new定义对象则使用栈空间
  • new对象指针用途广泛,比如作为函数返回值、函数参数等
(五)总结
  • new 类型() 在堆区申请 类型的大小空间,使用圆括号中的值,对该空间进行初始化;
  • new 类型[] 在堆区申请 连续 类型的空间,空间大小sizeof(类型) * []中的个数, 并使用默认的构造函数进行初始化。

这里主要说明new/delete的基本用法,至于malloc和new的具体区别,请关注后续文章。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698291.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号