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

2023-09-21 21:00:00





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



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 类型的内存空间 ,

int* p = (int*)malloc(sizeof(int));

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

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

代码示例 :

#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;
}

执行结果 :

*p = 10
Press any key to continue . . .

在这里插入图片描述


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


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


在下面的代码中 ,

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

int* p = (int*)malloc(sizeof(int));

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

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

代码示例 :

#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;
}

执行结果 :

*p = 10
Press any key to continue . . .

在这里插入图片描述

更多推荐

利用大模型&知识图谱技术,告别繁重文案,实现非结构化数据高效管理

我,作为一名产品经理,对文案工作可以说是又爱又恨,爱的是文档作为嘴替,可以事事展开揉碎讲清道明;恨的是只有一个脑子一双手,想一边澄清需求一边推广宣传一边发布版本一边申报认证实在是分身乏术!脑细胞有多少也不够用了…不管你是什么行业的职场人,在编写文案的路上,谁没经历过追热点、搜素材、求资料、拉框架、添创意、写主体、改措辞

Python 爬虫实战之爬淘宝商品并做数据分析

前言是这样的,之前接了一个金主的单子,他想在淘宝开个小鱼零食的网店,想对目前这个市场上的商品做一些分析,本来手动去做统计和分析也是可以的,这些信息都是对外展示的,只是手动比较麻烦,所以想托我去帮个忙。一、项目要求:具体的要求如下:1.在淘宝搜索“小鱼零食”,想知道前10页搜索结果的所有商品的销量和金额,按照他划定好的价

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

高云FPGA系列教程(10):letter-shell移植

文章目录letter-shell简介letter-shell源码获取letter-shell移植函数和变量应用示例本文是高云FPGA系列教程的第10篇文章。shell,中文是外壳的意思,就是操作系统的外壳。通过shell命令可以操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,

OpenCV(四十五):ORB特征点

1.特征点的组成特征点由关键点和描述子两部分组成:关键点是在图像中检测到的具有显著变化的位置坐标。描述子是用于表示关键点周围局部区域特征的向量或特征向量。2.ORB特征点原理ORB特征点由关键点FAST角点和描述子BRIEF组成。2.1提取FAST角点的算法FAST算法的思想:通过比较像素相对于中心像素有较大差别(过亮

flutter聊天界面-TextField输入框buildTextSpan实现@功能展示高亮功能

flutter聊天界面-TextField输入框buildTextSpan实现@功能展示高亮功能最近有位朋友讨论的时候,提到了输入框的高亮展示。在flutterTextField中需要插入特殊样式的标签,比如:“请@张三回答一下”,这一串字符在TextField中输入,当输入@时弹出好友列表选择,然后将“@张三”高亮显

用Vite从零到一创建React+ts项目

方式一:使用create-react-app命令创建项目1、使用以下命令初始化一个空的npm项目npminit-y2、输入以下命令安装Reactnpmicreate-react-appps:如果失败的话尝试(1:使用管理员身份执行命令(2:切换镜像重试3、输入以下命令创建项目create-react-app项目文件夹名

flask 插件 Flask-RESTful

1、安装pipinstallflask-restful2、使用HelloWorld一个简单的例子:#-*-coding:utf-8-*-fromflaskimportFlaskfromflask_restfulimportResource,Apiapp=Flask(__name__)api=Api(app)classH

解决react使用redux toolkits时出现的数组对象长度始终为0的怪异问题

有个react项目在添加购物车后,立马白屏,看一下console报错propertiesofundefined(readinglength)那意思是说数组没有长度,然后定位Header.tsx的182行,果然是数组长度报错回到具体代码中:发现shoppingCartItems实际是通过reduxToolkit(RTK)

大模型从入门到应用——LangChain:代理(Agents)-[工具(Tools):人工确认工具验证和Tools作为OpenAI函数]

分类目录:《大模型从入门到应用》总目录LangChain系列文章:基础知识快速入门安装与环境配置链(Chains)、代理(Agent:)和记忆(Memory)快速开发聊天模型模型(Models)基础知识大型语言模型(LLMs)基础知识LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(HumanInpu

Pytorch-YOLOv4梳理——原理和复现

yolov1到yolov3的梳理:YOLO总结,从YOLOv1到YOLOv3_追忆苔上雪的博客-CSDN博客首先说一点,就是yolov4的分支有点多,先梳理一下出现的顺序。AlexeyBochkovskiy提出了YOLOv4然后针对YOLOv4的模型缩放(modelscale),提出了Scaled-YOLOv4Scal

热文推荐