【C++】动态内存管理 ④ ( 对象的动态创建和释放引申思考 | 基础数据类型 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )

2023-10-15 17:14:56 浏览数 (1)

一、对象的动态创建和释放引申思考

malloc 和 free 是 C 语言 stdlib 标准库中的函数 , 用于 分配 和 回收 堆内存 ;

new 和 delete 是 C 语言中的 操作符 , 用于 分配 和 回收 堆内存 ;

在 C 语言中 , 兼容 C 语言 的 malloc 和 free 用法 , 但是推荐使用 new 和 delete 进行动态内存管理 ;

一般情况下 :

  • 使用 malloc 分配的内存 , 需要使用 free 进行释放 ;
  • 使用 new 分配的内存 , 需要使用 delete 进行释放 ;

那么 使用 malloc 申请的内存 , 是否能使用 delete 进行释放 ,

使用 new 申请的内存 , 是否能使用 free 进行释放 ,

下面分为不同类型的数据申请内存的几种情况进行讨论 :

  • 为基础数据类型分配内存
  • 为数组数据类型数据分配内存
  • 为类对象分配内存

二、基础数据类型 内存分析

1、malloc 分配内存 delete 释放内存

使用 malloc 函数 为 基础类型 分配的内存 , 可以使用 delete 进行释放 ;

在下面的代码中 ,

使用 malloc 函数 在 堆内存中 , 申请一个 int 类型的内存空间 ,

代码语言:javascript复制
int* p = (int*)malloc(sizeof(int));

然后使用 delete 释放内存空间 , 该程序正常执行 , 没有报错 , 说明对于 使用 malloc 函数 为 基础类型 申请的 堆内存空间 , 使用 delete 操作符 可以完成 free 函数的职能 , 成功释放内存空间 ;

代码语言:javascript复制
// malloc 申请的内存 使用 delete 释放
delete(p);

代码示例 :

代码语言:javascript复制
#include "iostream"
using namespace std;

int main()
{

	// C 语言中动态申请内存
	int* p = (int*)malloc(sizeof(int));
	*p = 10;

	cout << "*p = " << *p << endl;

	// malloc 申请的内存 使用 delete 释放
	delete(p);
	

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

代码语言:javascript复制
*p = 10
Press any key to continue . . .

2、new 分配内存 free 释放内存

使用 new 操作符 为 基础类型 分配的内存 , 可以使用 free 进行释放 ;

在下面的代码中 ,

使用 malloc 函数 在 堆内存中 , 申请一个 int 类型的内存空间 ,

代码语言:javascript复制
int* p = (int*)malloc(sizeof(int));

然后使用 delete 释放内存空间 , 该程序正常执行 , 没有报错 , 说明对于 使用 malloc 函数 为 基础类型 申请的 堆内存空间 , 使用 delete 操作符 可以完成 free 函数的职能 , 成功释放内存空间 ;

代码语言:javascript复制
// malloc 申请的内存 使用 delete 释放
delete(p);

代码示例 :

代码语言:javascript复制
#include "iostream"
using namespace std;

int main()
{

	// 使用 new 为基础类型在堆内存中申请内存空间
	int* p = new int;
	*p = 10;

	cout << "*p = " << *p << endl;

	// new 申请的内存 使用 free 释放
	free(p);
	

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

代码语言:javascript复制
*p = 10
Press any key to continue . . .

0 人点赞