c++内存管理

文章目录

  • [一. 内存管理是什么?](#一. 内存管理是什么?)
  • [二. 为什么要有内存管理?](#二. 为什么要有内存管理?)
  • [三. c++内存管理特性](#三. c++内存管理特性)
  • [四. operator new和operator delete](#四. operator new和operator delete)
  • [五. 定位new](#五. 定位new)
  • [六. malloc/free和new/delete的区别](#六. malloc/free和new/delete的区别)
  • [七. 内存泄漏](#七. 内存泄漏)
  • 总结:

一. 内存管理是什么?

c++内存管理是对标于c语言的动态申请释放堆区资源的方法。

二. 为什么要有内存管理?

为什么要替代掉c语言的malloc,calloc和realloc呢?

  1. c++用的是操作符,不是函数,它是用new来进行堆空间申请的,delete进行内存释放,所以,new对标malloc,delete对标于free,两者联系也算紧密。
  2. new申请空间有两个操作。1. 对于自定义类型回调用对应的构造函数,内置类型不做处理。2. 调用operator new函数,operator new是函数名,不是重载new!!!
  3. delete也是一样,1. 自定义类型调用对应的析构函数,内置类型不做处理。2. 调用operator delete。

三. c++内存管理特性

  1. 使用方法
  1. int * p = new int;
  2. int * p = new int();
  3. int * p = new int(10);
  4. int * ptr = new int10;
  5. int* ptr = new int10{1,2,3,4};
  6. 前面的都是new的用法,习惯了还是蛮简单的,至少我觉得比malloc简单一点;
  7. delete p; delete\[\] ptr;
  8. delete不需要加括号的,它本来就是操作符,不是函数!!!,但是要对标于申请单个和多个,如前面的p指针是申请单个类型空间的,使用delete p;但是申请一段连续空间就加\[\]进行释放即可,但是一定不要搞反了,变成delete\[\] p,delete ptr,这里会报错,而且不同编译器处理结果不同,一定一定不要搞反了!!!

四. operator new和operator delete

  1. operator new和operator delete都是函数,不是对new重载!!!
  2. 两者内部分别会调用malloc, free。
  3. operator\[\] new, operator\[\] delete 分别调用operator new,operator delete函数,间接调用了malloc,free。
  4. 所以,总的来说:看上去使用的仅仅是new,delete,其实编译器做了很多工作,而且内部其实还是用了c语言的malloc和free。
  5. 注意:申请一段n个类型连续空间的时候,delete\[\] 是调用了n次析构的,而且也调用了n次构造!!!

五. 定位new

  1. 我们有一个特殊场景,就是我们在向堆申请空间的时候,是要操作系统帮我们在堆区找到对应大小空间的区域给我们的,但是效率有点慢,有时候内存不足的时候我们有可能申请不到空间;所以我们有了一个池化技术,我们在堆区是申请到一片我们自己才能使用的地方,到时候我们要向堆区申请空间的时候直接到我们自己的地盘上申请,效率高,后面会用得到的。
  2. 这个时候申请到的堆区空间是没有初始化的,因为是我们自己的,不像new会帮自定义类型调用构造函数,我们自己要初始化就要用到了定位new了。
  3. 使用方式:假如指针p是指向到我们自己的堆区的申请到的空间的指针,new( p )A(10);
    A是自定义类型,10是构造函数的参数,要是默认构造就new( p )A就行了。显示调用构造进行初始化。

六. malloc/free和new/delete的区别

相同点:都是向堆区申请空间,而且需要我们手动是释放。

不同点:

  1. malloc , free是库函数,new,delete是操作符。
  2. malloc申请空间失败要我们自己判断,失败返回NULL;new失败会抛异常(后面学)。
  3. malloc申请成功返回值是void*,而new申请成功是返回对应类型的指针。
  4. malloc申请空间要我们手动计算空间为字节的单位大小,new直接指明类型(类型空间要再指明个数)即可,new更加方便。
  5. new和delete会调用对应自定义类型的构造函数和析构函数,malloc,free不会。

七. 内存泄漏

内存泄漏:没有释放已经不再使用的内存空间。

危害:电脑卡顿,程序挂掉。

类型:堆区空间没有释放,文件没有关闭等等。

后面有解决方案:检查事后有没有内存泄漏或者用智能指针一开始预防;

总结:

内存管理是我们重要的一个环节,也是我们学习语法的基石之一!!!

相关推荐
2601_9561219721 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-1 天前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
小星星闪亮登场1 天前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑1 天前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ1 天前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海1 天前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Henry Zhu1231 天前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
June`1 天前
warp shuffle指令
c++·人工智能·算法·cuda
乱七八糟的屋子1 天前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray