C++内存管理 - new/delete

new

在C语言中用于空间开辟的函数有: malloc, realloc, calloc.

在C++中则是使用new来开辟空间的.

new的使用

1. 为内置类型开辟空间

int* arr = new int[100];
// arr: 接收开辟好的空间的地址
// int: 开辟的空间是 int 类型的
// [100]: 代表开辟 100 个对应类型的空间
// 即 100 个 int 类型的空间: 100 * 4 = 400 字节

2. 为自定义类型开辟空间

class A
{
public:A(int a = 0);:_a(a){}
private:int _a;
}int main()
{A* pa = new A(10);// 为类型 A 实例化出一个对象, 并将对象中的 _a 初始化为10, 返回对象的地址return 0;
}

3. 为多个自定义类型开辟空间

class A
{
public:A(int a = 0);:_a(a){}
private:int _a;
}int main()
{A* p = new A[5]{1, 2, 3};// 创建了 5 个 A 类型对象, 前三个初始化为 1, 2, 3 后两个默认初始化为0return 0;
}

 new特性

1. new 对于内置类型没有什么区别

2. 对于自定义类型来说: 

   new 在创建对象时

   会通过调用自定义类型的构造函数来初始化对象

   而 malloc 或其他函数则不会, 只是单纯开辟出空间

delete

delete 则是用来代替C语言中的 free 函数.

delete 用来销毁开辟的空间, 回收空间资源.

delete的使用

1. 销毁内置类型

int* p = new int(10);
delete p;

对于单个对象, 使用 delete 进行空间销毁.
多个对象, 则需要使用 delete[] 来进行空间销毁.

int* p = new int[100];
delete[] p;

当使用 new 开辟了多个空间时 (new type[])

delete 也需要加上 [] 来释放空间 (delete []);

2. 销毁自定义类型

class A
{
public:A(int a = 0):_a(a){}~A(){}
private:int _a;
}int main()
{A* p = new A[10];A* tem = new A();delete tem;delete[] p;return 0;
}

使用方法和内置类型没有什么区别.

delete特性

1. 内置类型: delete 和 free 没有什么区别

2. 自定义类型: delete 会去调用对象的析构函数, free 则不会

3. 当面对多个空间时, delete 需要加上 [] (delete [])

 对于自定义类型还是使用 delete 来销毁, 否者可能造成内存泄漏.

class A
{
public:A(int size = 10){arr = new int[size];}~A(){delete[] arr;}
private:int* arr;
}

在上面的这个类中, 如果没有调用析构函数, 那么 arr 就没有被释放, 就造成了内存泄漏.
使用 free 只是释放了 arr 这个变量的空间, arr 所指向的空间并没有释放.

operator new 函数

new 的底层通过调用 operator new 函数来开辟空间.

operator new: 

虽然由 operator 关键字, 但是这里并不是运算符重载, 在这里, operator 就是一个名词

operator new 函数源码:

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
void *p;
while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}
return (p);
}

通过观察上面的源码可以看到:

new 底层还是通过 malloc 来开辟空间的.

使用 new 来开辟空间, 开辟成功, 返回指向此空间的指针, 失败则抛出异常.

operator delete 函数

同样 delete 底层也是通过调用 operator delete 函数来释放空间的.

operator delete 源码:

#define free(p) _free_dbg(p, _NORMAL_BLOCK)
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);__TRYpHead = pHdr(pUserData);_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLYreturn;
}

可以观察到: 

delete 调用了 _free_dbg(p, _NORMAL_BLOCK) 来释放空间.

_free_dbg(p, _NORMAL_BLOCK) 实际上就是 free(p)

 所以 delete 底层也是听过 free 来实现空间的释放的.

new创建对象的过程

对于内置类型 new 和 malloc 没有什么区别.

以下都针对于自定义类型

new

1. 调用 operator new 函数申请空间

2. 在申请空间之后, 调用对应的构造函数完成对象的构造

new type[n]

1. 调用 operator new[] 函数申请n份空间

2. 在申请空间之后, 调用 n次 对应的构造函数完成对象的构造

delete销毁对象的过程

对于内置类型 delete 和 free没有什么区别.

以下都针对于自定义类型

delete

1. 在空间上执行析构函数完成对象中资源的清理工作

2. 调用operator delete函数释放对象的空间

delete []

1. 在空间上 n次 执行析构函数完成对象中资源的清理工作

2. 调用 n次 operator delete函数释放对象的空间

new/delete 和 malloc/free区别

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可
  4. malloc的返回值为void, 在使用时必须强转,new不需要,因为new后跟的是空间的类型*
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473953.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot基于GIS的旅游信息管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

《Django 5 By Example》阅读笔记:p645-p650

《Django 5 By Example》学习第8天,p645-p650总结,总计6页。 一、技术总结 1.django-rest-framework (1)serializer p648, Serializer: Provides serialization for normal Python class instances。Serializer又细分为Serializer, ModelSerializer,…

5个有效的华为(HUAWEI)手机数据恢复方法

5个有效的手机数据恢复方法 华为智能手机中的数据丢失比许多人认为的更为普遍。发生这种类型的丢失有多种不同的原因,因此数据恢复软件的重要性。您永远不知道您的智能手机何时会在这方面垮台;因此,预防总比哀叹好,这就是为什么众…

【微软:多模态基础模型】(4)统一视觉模型

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微…

鸿蒙网络编程系列48-仓颉版UDP回声服务器示例

1. UDP回声服务器简介 回声服务器指的是这样一种服务器,它接受客户端的连接,并且把收到的数据原样返回给客户端,本系列的第2篇文章《鸿蒙网络编程系列2-UDP回声服务器的实现》中基于ArkTS语言在API 9的环境下实现了UDP回声服务器&#xff0c…

微博短链接平台-项目测试用例设计(Xmind)

技术栈:Spring BootMyBatis-PlusRedisShardingSphereSentinel 项目描述:微博短链接平台,提供了一个高效、安全和可靠的短链接管理平台。完成较长链接转换为短链接场景。比 如,受微博发送博文长度限制,仅能发表150字&am…

前端基础(四十一):实时获取麦克风音量

效果 源码 <button id"open">打开麦克风</button> <button id"close">关闭麦克风</button><input id"range" type"range" min"0" max"100" value"0" />let _mediaStrea…

jmeter常用配置元件介绍总结之配置元件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0c;也能支持WebS…

《基于 PySpark 的电影推荐系统分析及问题解决》

以下是一篇关于上述代码的博客文章&#xff1a; 基于PySpark的电影推荐系统实现与分析 在当今数字化时代&#xff0c;个性化推荐系统在各个领域中都发挥着至关重要的作用&#xff0c;尤其是在娱乐行业&#xff0c;如电影推荐。本文将详细介绍如何使用PySpark构建一个简单的电…

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量&#xff1f;什么是数据类型&#xff1f;2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …

性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告

云器Lakehouse正式发布性能测试报告 &#x1f3c5;离线批处理&#xff1a;在复杂批处理任务中&#xff0c;云器Lakehouse相较Spark表现出13.31倍性能提升。 &#x1f3c5;即席查询&#xff1a;在交互式分析场景下&#xff0c;云器Lakehouse相较Trino表现出9.84倍性能提升。 &am…

【MySQL】RedHat8安装mysql9.1

一、下载安装包 下载地址&#xff1a;MySQL Enterprise Edition Downloads | Oracle MySQL :: MySQL Community Downloads 安装包&#xff1a;mysql-enterprise-9.1.0_el8_x86_64_bundle.tar 官方 安装文档&#xff1a;MySQL Enterprise Edition Installation Guide 二、安装…

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时&#xff0c;有些时候&#xff0c;需要和第三方进行调式&#xff0c;但是第三方不在一起&#xff0c;需要进行远程调试&…

蜀道山CTF<最高的山最长的河>出题记录

出这道题的最开始感觉就是,因为现在逆向的形式好多,我最开始学习的时候,经常因为很多工具,或者手段完全不知道,就很懵逼,很多师傅都出了各种类型的,我就想着给以前的"自己"出一道正常exe,慢慢调的题,为了不那么简单,我就选择了C(究极混淆,可能比rust好点),让大家无聊…

Quartus+Nios II for eclipse问题合集

由于对于FPGANIOS II 的工作需要&#xff0c;对工作过程中遇到的问题进行记录&#xff0c;持续更新。 1、BSP directory does not exist: . Stop.Nios II使用过程中遇到的一些问题2_error executing nios2-bsp-generate-files --bsp-di-CSDN博客https://blog.csdn.net/qq_39485…

AWTK VSCode 实时预览插件端口冲突的解决办法

AWTK XML UI 预览插件&#xff1a;在 vscode 中实时预览 AWTK XML UI 文件&#xff0c;在 Copilot 的帮助下&#xff0c;可以大幅提高界面的开发效率。 主要特色&#xff1a; 真实的 UI 效果。可以设置主题&#xff0c;方便查看在不同主题下界面的效果。可以设置语言&#xf…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时&#xff0c;获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法&#xff0c;您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

如何对AWS进行节省

AWS 云服务器的费用确实可能会让人感到高昂&#xff0c;尤其是在资源使用不当或配置过多的情况下。不过&#xff0c;通过一些策略的合理应用和优化&#xff0c;完全可以降低云服务的使用成本&#xff0c;实现高效节省。以下是九河云总结的几种主要的优化方法&#xff0c;帮助你…

Macmini中普通鼠标与TrackPad联动问题解决

入手了一款Macmini&#xff0c;然后接了一个普通鼠标&#xff0c;然后又买了一个TrackPad。 接下来&#xff0c;问题来了&#xff0c;这两个玩意之间是联动的&#xff0c;出现问题的地方在于鼠标滚轮对于页面内容滚动的方向上。 通常Windows系统中&#xff0c;鼠标滚轮向前&am…