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

内存管理

目录

C/C++内存分布

引入

分析

说明

C语言内存管理方式:malloc calloc realloc  free

malloc

realloc

calloc

面试题

 C++内存管理方式

new/delete操作符

用法

new和delete操作自定义类型

 operator new和operator delete函数

operator new

​编辑

operator delete

总结

定位new

常见面试题

malloc/free和new/delete的区别

内存泄漏(了解)


C/C++内存分布

引入

栈区:函数参数,局部变量,编译器自动释放内存

堆区:动态内存申请的空间,程序员分配释放,如果不释放,可能会引起内存泄漏

代码区:代码

数据段:const修饰的变量,全局变量,静态变量

常量区:常量,字符串

分析

我们看以下代码

sizeof:求字节大小

strlen:求字符串中字符个数,\0结束

说明

C语言内存管理方式:malloc calloc realloc  free

realloc是在原空间上继续扩大空间,p2和p3指向同一篇空间,两次free报错

malloc

动态开辟内存

realloc

扩大空间

原地扩容:在已经开辟空间后面接着开辟空间

异地扩容:原开辟空间后面无法接着开辟开空间,就拷贝之前空间的内容到新空间,接着扩大空间,并释放掉之前的空间

calloc

开辟空间并将空间初始化

面试题

malloc/calloc/realloc的区别

 C++内存管理方式

C语言内存管理在c++中可以继续使用,但是有些方面用起来比较麻烦,C++提出了自己的内存管理方式,通过new和delete操作符进行

new/delete操作符

new和delete就相当于C语言中的malloc和free,但是new和delete在申请自定义类型空间的使用会调用构造函数和析构函数

用法

申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[ ]和delete[ ];

注意要匹配使用!

new和delete操作自定义类型

注意:与malloc/free不同的是,new/delete在对于自定义类型开空间的同时还会调用构造函数和析构函数

 operator new和operator delete函数

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

operator new

operator delete

总结

opeartor new也是malloc来申请空间,如果成功申请就直接返回,否则执行用户提供的空间不足的应对措施,如果用户提供措施就继续执行,否则就抛异常(try  catch函数)

operator delete最终也是通过free来释放空间

定位new

定位new表达式是在已分配原始内存空间中调用构造函数初始化一个对象

new(地址)type  或者 new(地址) type (参数)

new(pst)stack(4)

显示调用构造函数

一般配合内存池使用

常见面试题

malloc/free和new/delete的区别

从用法和底层原理来说明

用法:

1.malloc和free是函数,new和delete是操作符

2.malloc开辟的空间不可以初始化,new可以初始化

3.malloc申请空间需要手动计算空间大小,new只需要跟上空间类型即可,如果是多个对象,就在[ ]说明数组元素个数

4.malloc返回值是void*,使用时必须强转,new不需要,后面跟的就是空间类型

5.malloc申请失败是返回NULL,使用必须判空,new失败是抛出异常,需要捕获异常

底层原理:

6.在申请自定义类型对象时,malloc和free只会开辟空间,不会调用构造和析构函数

而new在申请空间成功后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理 

内存泄漏(了解)

用户使用内存后没有及时清理

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现

内存泄漏会导致响应越来越慢,最终卡死

相关文章:

  • 基于ubuntu22.04手动安装openstack——2023.2版本(最新版)的问题汇总
  • Redis 和 Mysql 如何保证数据一致性
  • 假冒 Skype 应用程序网络钓鱼分析
  • C语言--每日五道选择题--Day6
  • WPF ToggleButton 主题切换动画按钮
  • TensorRT安装部署指南(Windows10)
  • 采集Prestashop独立站采集Prestashop独立站
  • 【数据结构】树与二叉树(十一):二叉树的层次遍历(算法LevelOrder)
  • S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)
  • 多个微信快速同步发圈
  • 每日一练:Python中如何使用enumerate 函数创建带索引的元组
  • 什么是Ribbon的饥饿加载?有什么优势?
  • LeetCode_线段树_中等_307.区域和检索 - 数组可修改
  • 【PG】PostgreSQL 目录结构
  • 向量的范数、矩阵的范数
  • 自己简单写的 事件订阅机制
  • Consul Config 使用Git做版本控制的实现
  • eclipse(luna)创建web工程
  • input实现文字超出省略号功能
  • IP路由与转发
  • MaxCompute访问TableStore(OTS) 数据
  • Vue2.0 实现互斥
  • WebSocket使用
  • 阿里云前端周刊 - 第 26 期
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 一个完整Java Web项目背后的密码
  • No resource identifier found for attribute,RxJava之zip操作符
  • MPAndroidChart 教程:Y轴 YAxis
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​如何在iOS手机上查看应用日志
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #pragma 指令
  • $.ajax()方法详解
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (06)Hive——正则表达式
  • (SpringBoot)第二章:Spring创建和使用
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)socket Aio demo
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .NET 8.0 发布到 IIS
  • .Net CF下精确的计时器
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @ConditionalOnProperty注解使用说明
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [20190416]完善shared latch测试脚本2.txt
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AIGC] Redis基础命令集详细介绍
  • [android] 练习PopupWindow实现对话框
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]