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

【C++】入门【五】

本节目标


一、C/C++内存分布

二、C语言中动态内存管理方式

三、C++中动态内存管理

四、operator new与operator delete函数

五、new和delete的实现原理

六、定位new表达式(placement-new)

七、常见面试题


一、C/C++内存分布

  • 一个程序占用的内存主要有以下几部分
  • 栈区(stack)编译器自动分配与释放,存放运行时函数分配的局部变量,函数参数,返回数据,返回地址等,类似与数据结构里面的栈
  • 堆区(heap)一般由程序员进行分配,若没有释放,可能导致内存泄露
  • 全局区(静态区static)存放全局变量,静态数据,常量,程序结束后由系统释放,全局区又分为已初始化全局区和未初始化全局区,未初始化的放一边,已初始化的放一边
  • 常量区(文字常量区)存放常量字符串 程序结束后系统释放
  • 代码区(存放二进制代码)存放函数体等二进制代码

二、C语言中动态内存管理方式

  • 四个函数: malloc , calloc , realloc , free
  • 1.
  • malloc 动态开辟一块连续的空间,自己决定开辟多少
  • malloc底层使用brk和mmap函数实现的,当开辟空间小于128k时用brk,大于128k时用mmap
  • malloc是从堆中获取空间,当收到申请空间的申请时,操作系统中有一个记录空闲内存地址的链表,此时会遍历此链表,寻找第一个已释放,且空间大于所申请空间的堆结点,将该节点删除,该节点空间给新程序
  • 用法:
  • 2.
  • calloc 开辟空间同时初始化 等于malloc+memset
  • 用法:
  • 3.
  • realloc 对开辟的空间大小进行修改
  • 用法:
  • 4.
  • free 释放开辟空间
  • 用法:
  • 相关面试题:
  • malloc/calloc/realloc区别?
  • malloc的实现原理?

三、C++内存管理方式

C语言内存管理方式可以继续在C++中使用,但有些地方就有点无能为力,而且使用起来有些麻烦,因此C++有自己的内存管理方式,通过new和delete操作符来管理动态内存

1.new/delete操作内置类型

  • new 跟 malloc 类似
  • delete 跟 free 类似
  • 注意:释放多空间要加【】
  • 注意:申请和释放单个空间,使用new 和 delete, 申请和释放多个空间,使用new[]和delete[]

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

  • 用new创建一个新类对象,跟malloc不同的是,new还会调用类的构造函数
  • 用delete删除的话,则会调用类的析构函数
  • malloc跟free都不会调用构造函数和析构函数

四、operator new与operator delete函数(重要点进行讲解)

  • 总结:
  • malloc 申请空间
  • operator new 申请空间+报错
  • new 申请空间+报错+初始化
  • new底层用的operator new, operator new 底层用的malloc

五、new和delete的实现原理

1.内置类型

2.自定义类型


六、定位new表达式(placement-new)了解

  • 定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
  • 使用格式:
  • 使用场景:
  • 使用例子:

七、常见面试题

  • 1.什么是内存泄露?内存泄露的危害?
  • 2.内存泄露分类?(了解)
  • 3.如何检测内存泄露?(了解)
  • 4.如何避免内存泄露?
http://www.lryc.cn/news/497670.html

相关文章:

  • 【React】二、状态变量useState
  • SQL Server中的数据处理函数:提升SQL查询能力
  • TypeScript 语言学习入门级教程五
  • 上海市计算机学会竞赛平台2022年7月月赛丙组匹配括号(三)
  • 108.【C语言】数据结构之二叉树查找值为x的节点
  • Java学习笔记(10)--面向对象基础
  • 社群分享在商业引流与职业转型中的作用:开源 AI 智能名片 2+1 链动模式小程序的应用契机
  • nodejs官方文档学习-笔记-1
  • android视频播放器之DKVideoPlayer
  • Linux——基础命令(3)
  • MySQL备份恢复
  • 鲲鹏麒麟安装离线版MySQL5.7
  • 【不稳定的BUG】__scrt_is_managed_app()中断
  • MyBatis 详解
  • Cursor+Devbox AI开发快速入门
  • 编写按层次顺序(同一层自左至右)遍历二叉树的算法。或:按层次输出二叉树中所有结点;
  • docker 安装mysql8.0.29
  • vue深入理解输入框字符限制的优化设计
  • 完整指南:在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK
  • 【Leetcode Top 100】138. 随机链表的复制
  • 2024年12月HarmonyOS应用开发者基础认证全新题库
  • Flink问题总结
  • Day17 C++ vector 容器
  • 常见Linux命令(详解)
  • AgGrid 组件封装设计笔记:自定义 icon 以及每个 icon 的点击事件处理
  • vb.net常用命名空间
  • Netty面试内容整理-Netty 工作原理
  • CMD 介绍
  • 【项目日记】仿mudou的高并发服务器 --- 实现HTTP服务器
  • Android 使用TabLayout + ViewPager2 实现标签页的视图切换