【C++】堆区空间的申请和释放--- 2024.3.19

C++和C的区别(申请堆区空间)

c语言中,在遇到需要申请一块堆区空间时,我们往往会使用malloc申请,使用free进行释放,但是为什么在c++中要使用新的方法?其实是有原因的。

我们先尝试在c++中使用mallocfree函数试试,看会不会有什么问题。

代码如下:

class Maker
{
public:
	Maker()
	{
		cout << "构造函数" << endl;
	}

	Maker(int a)
	{
		cout << "有参构造函数" << endl;
	}
	~Maker()
	{
		cout << "析构函数" << endl;
	}
};

void test01()
{
	Maker* m = (Maker*)malloc(sizeof(Maker));

	free(m);
}


int main()
{
	test01();
}

接下来进行代码分析:

Maker* m = (Maker*)malloc(sizeof(Maker));

如上所示,由于声明的对象数据类型为Maker*,则在malloc之前也需要进行类型转换为Maker*,并且malloc中的参数为具体申请的空间大小,即数据类型Maker的大小,即sizeof(Maker)

free(m);

同样在使用完一块堆区空间之后,我们需要使用free函数对申请的堆区空间进行释放。

代码运行结果如下:

在这里插入图片描述

如上所示,在使用malloc申请堆区空间和使用free释放堆区空间时,并不会调用本身的构造函数和析构函数,这其实就是在c++中不使用mallocfree的原因,那到底用什么方法呢?这就是接下来要讲解的内容。

C++中的new和delete

c++中使用new的形式来申请堆区空间,使用delete的形式来释放堆区空间,具体使用案例如下:

class Maker
{
public:
	Maker()
	{
		cout << "构造函数" << endl;
	}

	Maker(int a)
	{
		cout << "有参构造函数" << endl;
	}
	~Maker()
	{
		cout << "析构函数" << endl;
	}
};

void test02()
{
	Maker* m = new Maker;
	
	delete m;
	m = NULL;

	Maker* m2 = new Maker(10);

	delete m2;
	m2 = NULL;
}

int main()
{
	test02();
}

接下来进行代码分析:

Maker* m = new Maker;

如上所示,使用new的方式来申请堆区空间,也不需要像malloc那样还需要传入申请的具体内存大小,这些部分实际上c++已经替我们处理了,所以我们只需要new + 实际的类即可。

delete m;

c++中使用delete来释放申请的堆区空间,由于之前我们已经实例化对象,并且实例化对象名为m,所以我们直接delete m即可。

m = NULL;

成功释放掉堆区空间之后,我们需要将实例化对象m置空,这也是为了保证代码的严谨和规范。

Maker* m2 = new Maker(10);

在之前的代码中,在申请堆区空间时,实际上调用的是类的构造函数,但是假如我们想要调用类的有参构造函数时,需要怎么调用呢?

如上代码所示,相较于无参构造函数,只需要在原来的基础上使用new Maker(10)的形式即可。

delete m2;

c++中使用delete来释放申请的堆区空间,由于之前我们已经实例化对象,并且实例化对象名为m2,所以我们直接delete m2即可。

m2 = NULL;

成功释放掉堆区空间之后,我们需要将实例化对象m2置空,这也是为了保证代码的严谨和规范。

代码运行结果如下:

在这里插入图片描述

如上所示,使用newdelete时,成功的调用了类的构造函数和析构函数,同时也实现了调用类的有参构造函数。

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-19 11:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-19 11:08:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-19 11:08:01       82 阅读
  4. Python语言-面向对象

    2024-03-19 11:08:01       91 阅读

热门阅读

  1. node后端helmet中间件

    2024-03-19 11:08:01       40 阅读
  2. win git filter-repo教程

    2024-03-19 11:08:01       41 阅读
  3. Vim替换时区分大小写

    2024-03-19 11:08:01       39 阅读
  4. word 及PPT 中修改公式字体

    2024-03-19 11:08:01       37 阅读
  5. Spring MVC中redirect重定向几种方式(重构)

    2024-03-19 11:08:01       45 阅读
  6. 【Git】012-Git 仓库初始化

    2024-03-19 11:08:01       33 阅读
  7. 项目域名协议https,访问接口链接协议http

    2024-03-19 11:08:01       36 阅读
  8. Go语言: 基础总结

    2024-03-19 11:08:01       40 阅读
  9. 举例说明自然语言处理(NLP)技术

    2024-03-19 11:08:01       39 阅读
  10. Appium IOS自动化锁屏与解锁

    2024-03-19 11:08:01       45 阅读