C++-Record23—new和delete的操作语法(对象的动态建立和释放)

目录

背景

基本语法

 举例说明

C与C++语言分配基础类型方式对比

C与C++语言分配数组变量的方式对比

C++语言中动态分配对象的方式

new和delete的深入分析  

总体代码


背景

1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。

注意: 第一,new和delete是运算符,不是函数,因此执行效率高;第二,这两个操作符是C++特有的。

2)虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。

用运算符"new"可以完成:基础类型变量、分配数组变量、分配类对象的分配内存。

基本语法

new和delete运 算符使用的一般格式为:

如果新开的是一个变量:

new int;  //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100);  //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址

如果新开是一个数组:

new char[10];  //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
new int[5][4];  //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p=new float (3.14159);  //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p

 举例说明

C与C++语言分配基础类型方式对比

对比同样是分配内存,在C语言中的操作:

分配基础类型
void main1301()
{
	// 
	int *p = (int *)malloc(sizeof(int));
	*p = 10;
	free(p);

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

 在C++中分配内存是, 这么做的:

void main1301()
{
	int *p2 = new int; //分配基础类型
	*p2 = 20;
	free(p2);

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

 这里再列举一个语法,如何在分配的同时,进行初始化:

void main1301()
{
	int *p3 = new int(30);
	printf("*p3:%d \n", *p3);
	delete p3;

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

直接在int(),中加入想初始化的值。 

C与C++语言分配数组变量的方式对比

在C语言中分配数组:

//分配数组变量
void main1302()
{
	//c语言分配数组
	int *p = (int *)malloc(sizeof(int) * 10);  //int array[10];
	p[0] = 1;
	free(p);

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

在C++中分配数组:

//分配数组变量
void main1302()
{
	//c++分配数组 
	int *pArray = new int[10] ;
	pArray[1] = 2;
	delete [] pArray; //数组不要把[] 忘记

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

 要牢记delete时候,不要把数组的"[]"给忘了!

如何指定字符串的字节数量来分配内存呢?比如,要分配一个25个字节的字符数组(用字符数组来模拟字符串):
 

void main1302()
{
	char *pArray2 = new char[25] ; //char buf[25]
	delete [] pArray2;
	
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

C++语言中动态分配对象的方式

先定义一个类:

class Test
{
public:
	Test(int _a)
	{
		a = _a;
		cout<<"构造函数执行" <<endl;
	}

	~Test()
	{
		cout<<"析构函数执行" <<endl;
	}

protected:
private:
	int a;
};

 在主函中进行调用:

//分配对象new delete
//相同 和 不同的地方 new能执行类型构造函数   delete操作符 能执行类的析构函数
void main()
{
	//c 
	Test *pT1 = (Test *)malloc(sizeof(Test));
	free(pT1);

	//c++
	Test *pT2 = new Test(10);
	delete pT2;

	cout<<"hello..."<<endl;
	system("pause");
}

 以上两种方法,都可以给对象分配内存空间,但还是又些许的不一样的。用new创建的对象,可以自由的动态调用类写的构造函数;同样,delete可以自由的动态调用类写的析构函数;而这是,C语言中的那种写法所不具备的。

new和delete的深入分析  

1. 如果用new创建的一个基础类型的时候,然后,用free去释放,结果是可运行;同理,如果是用malloc去创建一个基础类型用delete去释放,同样也会可运行。对于创建的对象是基础类型的时候,创建和释放的运算符不匹配是可以的

2. 如果用new创建的一个数组类型的时候,然后,用free去释放,结果是可运行;同理,如果是用malloc去创建一个数组类型,用delete去释放,同样也会可运行。对于创建的对象是数组类型的时候,创建和释放的运算符不匹配是可以的

3. 如果用new创建的一个对象的时候,然后,用free去释放,结果是可运行,但是,会发现没有执行一个析构函数;同理,如果是用malloc去创建一个对象,用delete去释放,同样也可运行。但是,会发现没有执行了一个构造 函数。对于创建的对象是对象的时候,创建和释放的运算符不匹配虽可运行,但没有执行析构或者构造函数。

结论:

malloc和free是属于C语言语法的运算符,只会分配内存,但不会调用类的构造和析构函数;new和delete是属于C++语言语法的运算符,不只会分配内存,还会调用类的构造和析构函数来完成对象的初始化。

 

总体代码

dm13_new和delete.cpp


#include <iostream>
using namespace std;

// 1
//		malloc	free				c语言的函数
//		new		delete 			操作符	c++的语法

//2		new 基础类型变量  分配数组变量  分配类对象

//3		

分配基础类型
void main1301()
{
	// 
	int *p = (int *)malloc(sizeof(int));
	*p = 10;
	free(p);

	int *p2 = new int; //分配基础类型
	*p2 = 20;
	free(p2);
	//
	int *p3 = new int(30);
	printf("*p3:%d \n", *p3);
	delete p3;

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

//分配数组变量
void main1302()
{
	//c语言分配数组
	int *p = (int *)malloc(sizeof(int) * 10);  //int array[10];
	p[0] = 1;
	free(p);

	//c++分配数组 
	int *pArray = new int[10] ;
	pArray[1] = 2;
	delete [] pArray; //数组不要把[] 忘记

	char *pArray2 = new char[25] ; //char buf[25]
	delete [] pArray2;
	

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

class Test
{
public:
	Test(int _a)
	{
		a = _a;
		cout<<"构造函数执行" <<endl;
	}

	~Test()
	{
		cout<<"析构函数执行" <<endl;
	}

protected:
private:
	int a;
};

//分配对象new delete
//相同 和 不同的地方 new能执行类型构造函数   delete操作符 能执行类的析构函数
void main()
{
	//c 
	Test *pT1 = (Test *)malloc(sizeof(Test));
	free(pT1);

	//c++
	Test *pT2 = new Test(10);
	delete pT2;

	cout<<"hello..."<<endl;
	system("pause");
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值