c++动态内存管理

news/2024/11/9 9:44:10/

1.回顾c语言中的动态内存管理

在c语言中,我们想要动态开辟一段空间,需要使用malloc,calloc,realloc几个函数

void* malloc (size_t size);
//在堆上申请size个字节的空间void* calloc (size_t num, size_t size);
//第一个参数是元素的数目,第二个参数是每个元素的大小,实际上申请的空间大小为num*size字节,并且会初始化为0void* realloc (void* ptr, size_t size);
//ptr是指向原来地址的指针,这个函数用于修改一个原先已经分配内存块的大小。(可以扩大,也可以缩小)
//size是修改后新空间的大小
//若果使用realloc扩容,分为原地扩容和异地扩容,如果是异地扩容,还会将原空间的元素拷贝到新空间,然后释放原空间并返回新空间的指针

当我们使用完这些空间的时候,我们要使用free函数将空间释放

2.c++中的动态内存管理

1.new和delete

在我们学习了c++之后,我们更倾向于使用new和delete进行动态内存管理。首先我们要知道new/delete是操作符,而malloc/realloc/calloc都是函数。下面我们介绍一下new/delete的使用方式

	int* p1 = new int;//new一个int类型的对象,不初始化int* p2 = new int(5);//new一个int类型的对象,初始化为5int* p3 = new int[10];//new十个int类型的对象,不初始化int* p4 = new int[10] {1, 2, 3, 4, 5};//new十个int类型的对象,并对前五个分别初始化为12345,后面5个初始化为0delete p1;delete p2;delete[] p3;//注意释放多个对象的时候要带[]delete[] p4;

2.new/delete操作自定义类型

如果我们申请空间用于存放内置数据类型,无论是使用new/delete还是malloc/realloc/calloc的效果都是一样的,可是如果是自定义类型,他们就有区别了,看下面的例子

class Date
{
public:Date(int year = 0, int month = 1, int day = 1):_year(year), _month(month), _day(day){cout << "Date(int year = 0, int month = 1, int day = 1)" << endl;}~Date(){cout << "~Date()" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date* pd1 = (Date*)malloc(sizeof(Date));free(pd1);cout << "*****************" << endl;Date* pd2 = new Date;delete pd2;return 0;
}

image-20230102152219299

从打印结果我们可以看出,malloc/free只是单纯的申请空间,并不进行初始化,而new的时候不仅开辟空间,还调用了自定义类型的构造函数进行初始化,在delete的时候调用析构函数进行资源的清理。

3.operator new与operator delete函数

operator new与operator delete都是函数,与运算符重载没有任何关系

void* operator new (std::size_t size) throw (std::bad_alloc);void operator delete (void* ptr) throw();

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的
全局函数,new在底层调用operator new全局函数来申请空间,operator new底层通过malloc申请空间。delete在底层通过operator delete全局函数来释放空间,operator delete底层调用free来释放空间。

4.malloc/free与new/delete的区别

  1. 前者是函数,后者是操作符
  2. malloc失败返回nullptr,new失败抛异常。
  3. 对于自定义类型,malloc只开空间,不初始化。new不仅开空间,还自动调用构造函数初始化
  4. 对于自定义类型,free的时候不会调用析构函数清理资源,而delete的时候会调用析构函数清理资源
  5. malloc申请空间要手动计算空间大小,而new只需要后面跟着类型即可。

http://www.ppmy.cn/news/8969.html

相关文章

Qt常用快捷键汇总

文章目录Win&#xff1a;常规界面Ui设计界面Linux差异&#xff1a;Win&#xff1a; 常规界面 F1 打开帮助 F2 跳到声明/定义 F3 普通查找的查找下一个 Linux:Ctrl G F4 切换.h/.cpp文件 F5 调试运行程序 F6 高级查找的查找下一个 F9 设置/取消断点 F10 单步调试 F11 进入函数…

STK异常场景介绍

本文介绍两种STK异常场景。 SMSC不能通过STK refresh命令更新终端插入带有STK应用的SIM卡,进入STK应用,选择”refresh SMSC”,然后进入短信设置,查看短信中心号码并没有更新。 关键Log MSG_ID_SAT_FILE_CHANGE_IND Local_Parameter --> Len = 256, Addr = 0x62B8F66C sa…

高级IO-多路转接

高级IO 以前的都是拷贝接口。write什么的就是将字符串拷贝到发送缓冲区中。 应用层等待接收缓冲区填写数据的过程算是IO吗&#xff1f;算 IO等待拷贝数据&#xff1b; 真正的IO的过程就是拷贝的过程。比如等待鱼上钩的时候也算是钓鱼(adj)&#xff0c;当把鱼拿上来的时候也…

Vlan的原理与配置

传统以太网的问题 规模大了&#xff0c;之后导致性能也很差&#xff0c;广播会增加 解决&#xff1a;用Vlan&#xff0c;不受地域限制&#xff0c;同一Vlan内的设备才能直接进行二层通信 实验 首先配置以上vlan与电脑ip 配置IP之后可以进行ping命令测试刚开始是连通的&#x…

【C语言】你对动态内存分配有多少了解呢

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、什么是动态内存分配二、为什…

JVM垃圾回收器-ParNew回收器:并行回收

文章目录学习资料垃圾回收器ParNew回收器&#xff1a;并行回收学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java JDK 8 JVM官方手册 垃圾回收器 ParNew回收器&#xff1a;并行回…

网络编程概述

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 网络编程嵌套字 UDP DatagramSocket API DatagramPacket API InetSocketAddress API 基于UDP实现服务端 代码&#xff1a; 分析&#xff1a;…

蓝桥杯寒假集训第五天(子串分值和)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 输入一个字符串&#xff0c;然后计算所有连续子串中没有重复字母的个数 输入描述&#xff1a; 第一行&#xff1a; 一个字符串 输出描述&#xff1a; 所有子串中没有…