C++ 第四弹动态内存管理

news2025/1/15 20:49:52

目录

1. C/C++程序内存划分

2. C语言中内存管理的方式

3. new /delete 和 new[]/delete[]

4. void* operator new(size_t size) 和 void operator delete(void*) 可以重载的

5. 定义为new表达式

6. 常见的面试题


1. C/C++程序内存划分

  

1. 栈 又叫堆栈 -- 非静态局部变量 / 函数参数 /返回值等等,栈是向下增长的。
2. 内存映射段 是高效的 I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
创建共享共享内存,做进程间通信。
  3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段 --存储全局数据和静态数据。
5. 代码段 -- 可执行的代码 /只读常量  

2. C语言中内存管理的方式

2.1申请malloc/calloc/realloc

malloc函数的功能是开辟指定字节大小的内存空间,如果开辟成功就返回该空间的首地址,如果开辟失败就返回一个NULL。传参时只需传入需要开辟的字节个数。

calloc函数的功能也是开辟指定大小的内存空间,如果开辟成功就返回该空间的首地址,如果开辟失败就返回一个NULL。calloc函数传参时需要传入开辟的内存用于存放的元素个数和每个元素的大小。calloc函数开辟好内存后会将空间内容中的每一个字节都初始化为0。

realloc函数可以调整已经开辟好的动态内存的大小,第一个参数是需要调整大小的动态内存的首地址,第二个参数是动态内存调整后的新大小。realloc函数与上面两个函数一样,如果开辟成功便返回开辟好的内存的首地址,开辟失败则返回NULL。

realloc函数调整动态内存大小的时候会有三种情况:
 1、原地扩。需扩展的空间后方有足够的空间可供扩展,此时,realloc函数直接在原空间后方进行扩展,并返回该内存空间首地址(即原来的首地址)。
 2、异地扩。需扩展的空间后方没有足够的空间可供扩展,此时,realloc函数会在堆区中重新找一块满足要求的内存空间,把原空间内的数据拷贝到新空间中,并主动将原空间内存释放(即还给操作系统),返回新内存空间的首地址。
 3、扩充失败。需扩展的空间后方没有足够的空间可供扩展,并且堆区中也没有符合需要开辟的内存大小的空间。结果就是开辟内存失败,返回一个NULL。
 

2.2释放free

 free函数的作用就是将malloc、calloc以及realloc函数申请的动态内存空间释放,其释放空间的大小取决于之前申请的内存空间的大小。

3. new /delete 和 new[]/delete[]

3.1使用方式

//动态申请单个某类型的空间
int* p=new int; 
delete p;
//动态申请多个某类型的空间
int* p=new int[10];
delete[]p;
//动态申请单个某类型的空间并初始化
int* p=new int(10);
delete p;
//动态申请多个某类型的空间并初始化
int* p=new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
delete[] p;
//自定义类型也是一样的

3.2底层实现原理

new的实现原理

调用void* operator new(size_t size)--->循环调用malloc

自定义类型 a. 调用void* operator new(size_t size)--->循环调用malloc b. 调用构造函数初始化对象

4. void* operator new(size_t size) 和 void operator delete(void*) 可以重载的

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

5. 定义为new表达式

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

5.1语法格式

new (place_address) type或者new (place_address) type(initializer-list)
place_address必须是一个指针, initializer-list是类型的初始化列表  

5.2使用场景:内存池

6. 常见的面试题

1.malloc/freenew/delete的区别

malloc/free new/delete 的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地
方是:
1. malloc free 是函数, new delete 是操作符
2. malloc 申请的空间不会初始化, new 可以初始化
3. malloc 申请空间时,需要手动计算空间大小并传递, new 只需在其后跟上空间的类型即可,
如果是多个对象, [] 中指定对象个数即可
4. malloc 的返回值为 void*, 在使用时必须强转, new 不需要,因为 new 后跟的是空间的类型
5. malloc 申请空间失败时,返回的是 NULL ,因此使用时必须判空, new 不需要,但是 new
要捕获异常
6. 申请自定义类型对象时, malloc/free 只会开辟空间,不会调用构造函数与析构函数,而 new
在申请空间后会调用构造函数完成对象的初始化, delete 在释放空间前会调用析构函数完成
空间中资源的清理

2.内存泄漏

2.1什么是内存泄漏?

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内
存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对
该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现
内存泄漏会导致响应越来越慢,最终卡死。

2.2内存泄漏分类

堆内存泄漏 (Heap leak)
堆内存指的是程序执行中依据须要分配通过 malloc / calloc / realloc / new 等从堆中分配的一
块内存,用完后必须通过调用相应的 free 或者 delete 删掉。假设程序的设计错误导致这部分
内存没有被释放,那么以后这部分空间将无法再被使用,就会产生 Heap Leak
系统资源泄漏
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放
掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定

2.3如何检测内存泄漏

2.4如何避免内存泄漏

内存泄漏非常常见,解决方案分为两种: 1 、事前预防型。如智能指针等。 2 、事后查错型。如泄
漏检测工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP代码审计之环境配置

PHP代码审计之环境配置 前言一、PHP环境配置1.1 phpstudy和phpstorm下载配置1.2 Xdebug 配置1.3 phpstudy 基本使用1.4 phpstorm基本使用1.5 RIPR下载使用 二、代码审计配置文件2.5 PHP的核心配置(php.ini)1. safe_mode2. magic_quote_gpc3. magic_quote…

Maven学习1_将项目打包jar然后上传到GitHub、Nexus Sonatype仓库、搭建Sonatype私服

概述 主要学习记录Maven仓库相关知识,如何借助上传项目jar包到GitHub、Nexus Sonatype,,以及搭建自己的Nexus Sonatype私服,然后在Maven项目的pom文件引入使用,参考Maven官网文档:https://central.sonatype.org/publi…

【SQL应知应会】分析函数的点点滴滴(三)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数:…

HDFS写流程源码分析(一)-客户端

HDFS 写流程源码分析 一、客户端(一)文件创建及Pipeline构建阶段(二)数据写入(三)输出流关闭 二、服务端 环境为hadoop 3.1.3 一、客户端 以下代码创建并写入文件。 public void create() throws URISynt…

计网学习记录

ps:答案可能不正确噢。 1.什么是计算机网络体系结构?什么是网络协议?协议的三要素是什么?每个要素的含义是什么? 计算机网络体系结构: 我看书上也没说清啊。。。 (概念磨人啊) 什么是计算机的…

WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器(更新中)

文章目录 官方文档往期回顾零基础笔记项目实战(已完结) WPF项目创建为什么选net core版本 WPF 静态页面WPF 页面布局WPF样式 官方文档 往期回顾 零基础笔记 WPF 零基础入门笔记(0):WPF简介 项目实战(已…

github 代码实战pycharm

文章目录 下载代码配置环境进入环境下载数据集使用pycharm训练模型 下载代码 配置环境 conda env create -f environment.yml 进入环境 conda activate pytorch-CycleGAN-and-pix2pix 下载数据集 搜索download_pix2pix_dataset.sh然后用记事本打开,会发现有一个…

SpringBoot 疫苗接种管理系统 -计算机毕设 附源码83448

SpringBoot疫苗接种管理系统 摘 要 在目前的形势下,科技力量已成为我国的主要竞争力。而在科学技术领域,计算机的使用逐渐达到成熟,无论是从国家到企业再到家庭,计算机都发挥着其不可替代的作用,可以说计算机的可用领…

【软件架构】软件的设计图纸(用例图,类图,状态图,活动图,顺序图)

【软件架构】软件的设计图纸(用例图,类图,状态图,活动图,顺序图)_bdview的博客-CSDN博客 按图索骥---软件的设计图纸 序: 我一直以为,在软件设计中,各种图要比文档重要的多。图可以更加直接的…

RocketMQ 常见面试题(二)

broker如何处理拉取请求的? Broker处理拉取请求的具体流程如下: 客户端向Broker发送拉取请求,请求指定要拉取的主题名称和消费者组信息。 Broker首先会检查该消费者组是否已经存在,如果不存在则会创建该消费者组,并为…

Dubbox是什么,如何整合SpringBoot,有什么优势?

目录 一、Dubbox 是什么 二、Dubbox 如何整合SpringBoot 三、Dubbox 有什么优势 一、Dubbox 是什么 Dubbox是一款基于Java语言的分布式服务框架,是阿里巴巴公司开源的一款服务化治理框架,其前身为Dubbo。Dubbox是针对Dubbo进行了改进和升级&#xff…

akima 插值拟合算法 Python/C++/C版本

目录 前言Akima简介Akima优势 算法的代码实现python版C 版代码解析1代码解析2代码解析3 C版 实验对比 前言 鉴于“长沙等你”网站上Akima算法文章大部分要VIP观看或者下载,即使是付费也有质量不佳,浪费Money也浪费时间。 笔者根据查到的资料分享给大家。…

第5章 链路层

1、局域网的协议结构一般不包括( ) A. 数据链路层B. 网络层C. 物理层D. 介质访问控制层 逻辑链路控制子层、介质访问控制子层、物理层 2、下列关于二维奇偶校验的说法,正确的是( ) A. 可以检测和纠正双比特差错B…

NodeJS 了解和快速入门 - 实现 http 服务 操作 mysql

目录 1. 介绍 NodeJS 2. NodeJS 快速入门 3. NodeJS 实现 Httpserver 服务 4. NodeJS 操作 MySQL 数据库 1. 介绍 NodeJS 1. Node 是一个让 JavaScript 运行在服务端的开发平台, 它让 JavaScript成为与 PHP, Python, Perl, Ruby 等服务端语言平起平坐的脚本语言, 发布于 200…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

VUE L 表单数据过滤器 ⑨

目录 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨ V u e j s Vuejs Vuejs收集表单数据过滤器 使用 C o o k i e Cookie Cookie 影响总结 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹…

如何将Springboot项目升级成Springcloud项目

本文以nacos为例 分为以下几个步骤 1. 下载nacos软件 2. pom文件配置 3. application.yml文件配置 4. 代码调用 5. 效果展示 一 . 下载nacos软件 1.1 下载nacos-server-2.2.0-BETA这个版本 1.2 修改nacos配置文件 打开bin目录下的startup.cmd,将第26行的 set MO…

【计算机网络】第二章 物理层(下)

文章目录 2.5 信道的极限容量2.5.1 奈氏准则2.5.2 香农公式2.5.3 练习题 2.6 章节小结2.7 章节习题 2.5 信道的极限容量 2.5.1 奈氏准则 理想低通信道的最高码元传输速率 2W Baud 2W 码元 / 秒 理想带通信道的最高码元传输速率 W Baud W 码元 / 秒 W : 信道带宽&#xff08…

OZON、雅虎自养号测评如何塑造伪装度极高的测评环境

在测评领域,每个卖家和工作室都深知:创建安全可靠的网络环境对于未来发展是至关重要的。如何打造一个伪装度极高的评测环境,这一问题始终困扰着许多人。 从早期的虚拟机、模拟机、云手机、VPS等系统方案成本高且成号率低。因此,一…

php对接微信公众号扫码登录开发实录(H5微信扫描登录、服务出现故障调试、模版消息设置、扫码轮询交互)

微信公众号扫码登录开发实录 前言一、服务器配置1.微信公众号配置2.本地服务器验证程序 二、生成登录二维码1.生成微信登录二维码2.封装成便于刷新的函数 三、扫码验证和交互四、模版消息设置五、开发中遇见的问题1.该公众号提供的服务出现故障,请稍后再试&#xff…