当前位置: 首页 > news >正文

详解 new 和 delete

目录

一、简要描述两者的作用

二、实例解析

1. 浅层区别

2. 深层区别

三、拓展(operator new 的妙用)


一、简要描述两者的作用

new : 是c++推崇的 内存申请 方式,拥有比 malloc 更先进的机制

delete :是 对应的 内存释放方式,拥有比 free 更先进的机制

二、实例解析

1. 浅层区别

malloc 需要 计算实际需要的 字节数,而 new 则不需要

new 在申请基础类型内存块时,可以对 空间进行初始化 ,malloc 则不会

new 在内存申请失败后 会抛出异常, 而 malloc 则是返回NULL 需要对指针进行 NULL 检查

int main()
{int* arr = (int*)malloc(sizeof(int)*2);if (arr == NULL){cout << "检查后 -- malloc 失败" << endl;return 1;}elsecout << arr[0] << " " << arr[1] << endl;int* arr2 = new int[2] {1, 2};cout << arr2[0] << " " << arr2[1] << endl;return 0;
}

2. 深层区别

在对自定义类型(类,结构体等)进行内存申请时,malloc 同样只是申请对应 字节大小的空间,而 new 则会在申请后,去调用 自定义类型的 构造方法,对其进行初始化

同样 delete 在 释放 空间时 会去调用对应的 析构方法,实现对 类对象的 完全释放,避免成员指针指向空间没有被释放的 泄露问题。

class Test_new_delete
{
public:Test_new_delete(){_arrptr = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "new 主动调用构造方法 " << endl;}~Test_new_delete(){cout << "delete 主动调用析构方法 并对成员指针进行了释放防止内存泄漏 " << endl;delete[] _arrptr;}int* _arrptr;
};
int main()
{Test_new_delete* ptr0 = (Test_new_delete*)malloc(sizeof(ptr0));cout << "malloc 创建的ptr0 没有进行初始化 :" << ptr0->_arrptr << endl;free(ptr0);cout << "free 只是释放了的内存块,但是其中的指针所指向的空间并没有被释放,会造成内存泄露 " << endl;cout << endl << " ----------- " << endl << endl;Test_new_delete* ptr = new Test_new_delete;cout << "malloc 创建的ptr 通过调用构造方法进行初始化 :" << ptr->_arrptr << endl;delete ptr;return 0;
}

三、拓展(operator new 的妙用)

1. 在 调用 new  之后 ,new 内部会去调用 operator new  ,库中operator new 再去调用 malloc 进而进行内存申请,但是 operator new 中还会 在申请内存后进行 检查,如果malloc 内存申请失败 则会进行抛异常。

2. 用户可以在类中 对 operator new 进行重载,进而实现 指定类在调用 new 之后 ,去调用 自己实现 的 operator new ,而不调用 库函数,进一步实现 功能的自定义


class ST
{
public :void* operator new(size_t i){cout << "调用自己实现的 operator new" << endl;return (void*) 9;}
};
int main()
{void* ptr = new ST();cout << ptr << endl;return 0;
}


文章转载自:

http://pcG8iCqa.qzgLh.cn
http://67LeI17p.qzgLh.cn
http://FkurunoD.qzgLh.cn
http://2ObBGQIx.qzgLh.cn
http://d0EbPFpS.qzgLh.cn
http://cD8LheCz.qzgLh.cn
http://PvwUwfFx.qzgLh.cn
http://7Dpkzz79.qzgLh.cn
http://symz5KP7.qzgLh.cn
http://uZUe1zka.qzgLh.cn
http://X6QMnW2x.qzgLh.cn
http://ayidCP43.qzgLh.cn
http://QcBzxliX.qzgLh.cn
http://kvHrNbII.qzgLh.cn
http://QYXthX6z.qzgLh.cn
http://7yh2ku8z.qzgLh.cn
http://Xk3zierN.qzgLh.cn
http://rpdfNRgg.qzgLh.cn
http://GIH90zuc.qzgLh.cn
http://Uft7mijG.qzgLh.cn
http://GS5Wfjb1.qzgLh.cn
http://OtTEvNgi.qzgLh.cn
http://ptKA96Ku.qzgLh.cn
http://J4vVtii3.qzgLh.cn
http://nUNeDNeR.qzgLh.cn
http://HFUf9CUG.qzgLh.cn
http://a280cXv6.qzgLh.cn
http://A4Xin5Kl.qzgLh.cn
http://c4dR6hat.qzgLh.cn
http://jYmNRhdf.qzgLh.cn
http://www.dtcms.com/a/383997.html

相关文章:

  • 基于PassGAN的密码训练系统设计与实现
  • 避开Java日期格式化陷阱:`yyyy`与`YYYY`的正确使用
  • SpringCloud与Dubbo实战对决:从协议到治理的全维度选型指南(一)
  • SAP HANA Scale-out 04:CalculationView优化
  • 删除文件夹里的网盘图标
  • MPC模型预测控制:一种先进的控制策略
  • 【数据集】基于观测的全球月度网格化海表pCO₂与海气CO₂通量产品及其月气候平均值
  • RS485简介
  • Claude Code vs Codex
  • 多语言编码Agent解决方案(5)-IntelliJ插件实现
  • 光纤入户技术:原理、策略与市场博弈
  • DeerFlow实践: 日程管理智能体应用框架设计
  • spring、springboot、springCloud
  • Thymeleaf
  • 美团首款AI Agent产品“小美”公测,AI会带来什么?
  • 在 UE5 中配置 SVN 版本工具
  • Qwen3 模型结构解析
  • class_8:java继承
  • Django模型与数据库表映射的两种方式
  • 国产化监控方案:金仓数据库 + Nagios 从零搭建指南,核心指标实时掌握
  • 【Linux探索学习】第一篇Linux的基本指令(1)——开启Linux学习第一篇
  • 关于android.permission.CAPTURE_AUDIO_OUTPUT
  • Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
  • Redis和数据库的一致性
  • 使用node-Express框架写一个学校宿舍管理系统练习项目-前后端分离
  • 上下文工程实践 - 工具管理(上篇)
  • Spring Boot 项目瘦身实战
  • 【git基础】关于新仓库创建的几种方式
  • Dify 中的上下文变量以及它们与 system、user 变量的关系和配合方式
  • 【Android】可折叠式标题栏