C++57个入门知识点_26 new与delete使用注意事项(当申请一个堆上对象时,使用new和delete需配对,不能用malloc和free替换;new[]与delete[]数组操作要配套使用)

上篇C++57个入门知识点_25 new与delete(对于对象: new创建时先分配堆内存后调用构造函数,delete先调用析构,后释放堆空间;malloc和free只是堆内存操作,不会调用构造和析构)介绍了C++中newdelete的基本用法,本篇将会介绍其使用的注意事项。

总结:

  1. 当使用基本数据类型的时候,newdeletemallocfree是可以相互替换的
  2. 当申请一个堆上的对象时,使用newdelete需要配对,不能用mallocfree替换
  3. new[]分配数组,delete[]释放数组空间
  4. new[]delete[]要配套使用(特别是申请对象数组时)
  5. VS编译器会在new[]申请对象数组时,在堆开始前的4个字节,写入当前数组的长度,用于记录delete[]释放时,析构调用次数。

1. new和delete,malloc和free区别及是否可以混用?

(1) 当使用基本数据类型的时候,newdeletemallocfree是可以相互替换的
(2) 当申请一个堆上的对象时,使用newdelete需要配对,不能用mallocfree替换

1.1 new和delete,malloc和free在基本数据类型的混用

  • newfree混用
int main(int argc, char* argv[])
{	
	//使用new int(123)赋初值
	int* pN = new int(123);	
	free(pN);
	return 0;
}

运行结果:free实现对堆空间的释放
在这里插入图片描述

  • mallocdelete混用
int main(int argc, char* argv[])
{
	int* pN = (int*)malloc(sizeof(int));
	delete pN;
	return 0;
}

运行结果:堆空间得到释放
在这里插入图片描述
在这里插入图片描述

1.2 new和delete,malloc和free在对象操作时的混用

上面是对基本数据类型操作,看起来是可以混用的,那么针对对象的操作可以混用吗?

  • new创建对象,free释放对象
int main(int argc, char* argv[])
{
	//在堆上创建一个对象
	CStudent* pStu = new CStudent;

	//判断对象是否为空,不为空则进行释放
	if (pStu != nullptr) {
	
		free(pStu);
	}
	
	return 0;
}

运行结果:对象的内存被释放
在这里插入图片描述
new在创建空间的时候会调用构造函数,delete时会调用析构函数,再释放空间。上述过程 new创建时调用了构造函数,但是free释放对象时没有调用析构函数

  • 使用mallocdelete混用也是类似的,malloc创建对象空间,delete时会调用析构函数,并释放空间。

2. 利用new和delete对数组操作

(1) new[]分配数组,delete[]释放数组空间
(2) new[]delete[]要配套使用(特别是申请对象数组时)
(3) VS编译器会在new[]申请对象数组时,在堆开始前的4个字节,写入当前数组的长度,用于记录delete[]释放时,析构调用次数。

2.1 利用new和delete对基本数据类型数组操作

基本数据类型,不加[]释放时起到的作用与加[]效果是一样的。

int main(int argc, char* argv[])
{
	//堆上申请分配10个int大小数组
	int* pN = new int[10];
	delete[] pN;

	return 0;
}

2.2 利用new和delete对对象数组的使用操作

  • 创建具有10个对象的对象数组,如果使用delete pStu进行释放。
int main(int argc, char* argv[])
{
	CStudent* pStu = new CStudent[10];
	delete pStu;
	
	return 0;
}

运行结果:只析构了一次,且程序出现崩溃
在这里插入图片描述

  • 创建具有10个对象的对象数组,如果使用delete[] pStu进行释放
int main(int argc, char* argv[])
{
	CStudent* pStu = new CStudent[10];
	delete[] pStu;
	
	return 0;
}

运行结果:内存全部释放,析构10次
在这里插入图片描述

  • 在堆上创建一个对象数组时,10个对象,构造十次,编译器怎么记录创建对象个数?

查看内存中对象数组开始位置前不是我们之前看到的"fd fd fd fd"而是"0a 00 00 00"
在这里插入图片描述
我们如果将"0a 00 00 00"改成"08 00 00 00"时,会发生什么呢?
运行结果如下:析构8次
在这里插入图片描述
出现上面结果的原因为:VS编译器会在new[]申请对象数组时,在堆开始前的4个字节,写入当前数组的长度,用于记录delete[]释放时,析构调用次数。

3.视频学习地址:C++57个入门知识点_26 new与delete使用注意事项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值