C++_复习06(对象的动态建立和释放 _ new和delete操作符)

一、对象的动态建立和释放

1.1.1 前言

  • 在C语言中利用库函数 malloc 和 free 来分配和撇销内存空间。
  • C++ 提供较简使而功能较强的运算符new和delete类取代malloc和free函数。特别注意:new和delete是运算符,并不是函数,因此执行效率高!
  • 为了兼容C语言,c++仍然保留 malloc 和 free 函数,但是建议不要使用,而是使用 new和delete。

1.1.2 基本语法

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

二、例子分析

2.1.1 例一

下面代码分别展示了C语言与c++在分配基础类型、分配数组、分配对象的做法。

#include <iostream>
using namespace std;

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

private:
	int a;
};

// new和delete的基本语法与malloc和free进行对比
void objplay1()
{
    //分配基础类型
    //c语言
	int *p = (int *)malloc(sizeof(int));
	*p = 10;
    //c++
	int *p2 = new int;
	*p = 20;
	int *p3 = new int(30);

    //分配数组
	//c语言分配数组
	int *pArray_1 = (int*)malloc(sizeof(int) * 10);
	pArray_1[0] = 1;
	free(pArray_1);
	//C++分配数组
	int *pArray_2 = new int[10];
	pArray_2[1] = 2;
	delete[] pArray_2; //数组是要[]

	//分配对象
	//new能自动的执行类型构造函数,delete能执行类的析构函数
	//C语言
	Test *pT1 = (Test *)malloc(sizeof(Test));
	free(pT1);
	//C++
	Test *pT2 = new Test(10);
	delete pT2;
}

2.2.2 例二

#include <iostream>
using namespace std;

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

private:
	int a;
};

// malloc free 属于C语言的函,只会分配和删除内存大小,不会调用类的构造函数和析构数
// new	delete 属于C++的操作符,new和delete不光会分配内存和删除内存,还会调用构造函数和析构函数,就是会初始化对象
// 用malloc分配的内存可以用delete释放吗? 基础类型√ 基础类型数组√ 自定义对象√
// 用new分配的内存可以用free释放吗? 基础类型√ 基础类型数组√ 自定义对象√

void objplay2() {
	int *p = (int *)malloc(sizeof(int));
	*p = 10;

	int *p2 = new int;//分配基础类型
	*p = 20;
	int *p3 = new int(30);
}

结论:

  • malloc free 属于C语言的函, 只会分配和删除内存大小,不会调用类的构造函数和析构数
  •  new 和delete 属于C++的操作符,new和delete不光会分配内存和删除内存,还会调用构造函数和析构函数,就是会初始化对象
  • 用malloc分配的内存可以用delete释放吗? 基础类型√ 基础类型数组√ 自定义对象√
  •  用new分配的内存可以用free释放吗? 基础类型√ 基础类型数组√ 自定义对象√
发布了27 篇原创文章 · 获赞 3 · 访问量 3337

猜你喜欢

转载自blog.csdn.net/weixin_40977054/article/details/102570075