C++基础知识点整理笔记(四)

  1. C++的内存管理

在C++中,内存被分成五个区:栈、堆、自由存储区、静态存储区、常量区

  • (一) 栈:存放函数的参数和局部变量,编译器自动分配和释放
  • (二) 堆:new关键字动态分配的内存,由程序员手动进行释放,否则程序结束后,由操作系统自动进行回收
  • (三) 自由存储区:由malloc分配的内存,和堆十分相似,由对应的free进行释放
  • (四) 全局/静态存储区:存放全局变量和静态变量
  • (五) 常量区:存放常量,不允许被修改
  1. C++中内存泄漏的几种情况

内存泄漏是指己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。有以下几个原因:

  • 1)类的构造函数和析构函数中new和delete没有配套
  • 2)在释放对象数组时没有使用delete\[\],使用了delete
  • 3)没有将基类的析构函数定义为虚函数,当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确释放,因此造成内存泄露
  • 4)没有正确的清楚嵌套的对象指针
  1. new、delete、malloc、free之间的关系
  • new/delete,malloc/free都是动态分配内存的方式;
  • new/delete是运算符,编译器保证调用构造和析构函数对对象进行初始化/析构,但是库函数malloc/free是库函数,不会执行构造/析构;
  • new会自动计算需分配的空间,malloc不行;
  • new是类型安全的,而malloc不是;
  • new返回指定类型指针,malloc返回void*指针,需要强制类型转换;
  • new可以被重载,malloc不能
  • new底层调用malloc函数分配内存,然后调用构造函数
  1. delete和delete\[\]的区别
  • a) delete只会调用一次析构函数,而delete\[\]会调用每个成员的析构函数
  • b) 用new分配的内存用delete释放,用new\[\]分配的内存用delete\[\]释放

delete和delete\[\]是用于释放动态分配的内存的C++关键字,它们之间有一些重要的区别:

  1. delete用于释放通过`new`分配的单个对象的内存,而delete\[\]用于释放通过`new\[\]`分配的数组的内存。

  2. 释放数组必须使用delete\[\],而不能使用delete。因为对于使用`new\[\]`分配的动态数组,编译器在内存中存储了有关数组长度的额外信息,这样在释放数组时才能正确处理。

  3. delete和delete\[\]的用法不同。delete用于对单个对象的指针进行释放,例如`delete obj;`。delete\[\]用于对数组的指针进行释放,例如`delete\[\] arr;`。

  4. delete要求指针指向通过`new`分配的单个对象,而delete\[\]要求指针指向通过`new\[\]`分配的数组。如果不符合要求,行为是未定义的。

总结来说,delete和delete\[\]的最主要的区别在于对于动态数组的释放:delete用于释放单个对象的内存,而delete\[\]用于释放动态数组的内存,并且使用方式也不同。使用delete来释放通过new\[\]分配的数组会导致未定义行为,同样使用delete\[\]来释放通过new分配的单个对象也会出错。因此,为了避免内存泄漏和意外行为,需要正确选择delete或delete\[\]来释放对应的内存。

相关推荐
老当益壮梁奶奶7 小时前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
Flynt7 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet7 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
GG-_-Bond7 小时前
9.1 kv存储resp协议模拟面试
c++
GreenTea7 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
米糕闯编程8 小时前
鱼香ros2(五)用C++编写节点
c++·ros2·cmakelists·鱼香
小叶肥辉8 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
xiangyun619 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun619 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
从零开始的嵌入式之旅10 小时前
day44
arm开发·经验分享·笔记·嵌入式硬件