C和C++内存管理

目录:
一:C和C++内存分布
二:C动态内存管理方式
三:C++动态内存管理方式
四:operator newoperator delete函数
五:newdelete的实现原理
六:定位new表达式(placement-new)
七:经典面试题

思维导图:

1:C和C++内存分布

接下来我们来做个题:

 以下变量存放在哪一个区域:

问题1:

 globalVar在哪里?____   staticGlobalVar在哪里?____
   staticVar在哪里?____   localVar在哪里?____
   num1 在哪里?____

问题2:

 sizeof ( num1 ) = ____ ;  
sizeof ( char2 ) = ____ ;       strlen ( char2 ) = ____ ;
sizeof ( pChar3 ) = ____ ;     strlen ( pChar3 ) = ____ ;
sizeof ( ptr1 ) = ____ ;

注解:

1.)又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. )内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
3. )用于程序运行时动态内存分配,堆是可以上增长的。
4.) 数据段(也被称为数据区、静态数据区、静态区)--存储全局数据和静态数据
5.) 代码段(常量区)--可执行的代码/只读常量 

2:C动态内存管理方式
void Test ()
{
int* p1 = (int*) malloc(sizeof(int));
free(p1);int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);free(p3 );
}
2.1 malloc,realloc,calloc 区别

malloc:在堆上开辟一块空间

realloc:进行对空间的扩容,可能原地扩,也可能异地扩

calloc:开辟空间并把开好 的空间进行初始化

2.2 动态开辟的内存需要frre? 

毋庸置疑的,必须进行释放,否则会造成内存泄漏

3:C++动态内存管理方式
   通过new和delete操作符进行动态内存管理。
3.1 对内置类型的处理

     //注意:申请和释放单个元素的空间,使用new和delete操作符后面加变量名字,
    // 申请和释放连续的空间,使用new[]和delete[]在加名字,
    //注意:匹配起来使用。

3.2对自定义类型的处理

 对于自定义类型的delete 和内置类型的销毁是不一样的在底层逻辑上:

注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

4:operator newoperator delete函数

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

operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。

5:newdelete的实现原理

new , delete 对自定义类型的处理机制

new 的原理
1. 调用 operator new 函数申请空间
2. 在申请的空间上执行构造函数,完成对象的构造
delete 的原理
1. 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用 operator delete 函数释放对象的空间
new T[N] 的原理
1. 调用 operator new[] 函数,在 operator new[] 中实际调用 operator new 函数完成 N个对
象空间的申请
2. 在申请的空间上执行 N次构造函数
delete[ ] 的原理
1. 在释放的对象空间上执行 N 次析构函数,完成 N 个对象中资源的清理
2. 调用 operator delete[] 释放空间,实际在 operator delete[] 中调用 operator delete 来释
放空间
6:定位new表达式(placement-new)

定位 new 表达式是在 已分配的原始内存空间中调用构造函数初始化一个对象
使用格式:
new (place_address) type 或者 new (place_address) type(initializer-list)
place_address 必须是一个指针, initializer-list 是类型的初始化列表
使用场景:
定位 new 表达式在实际中一般是 配合内存池使用 。因为内存池分配出的内存没有初始化,所以如 果是自定义类型的对象,需要使用new 的定义表达式进行显示调构造函数进行初始化。
7:经典面试题
7.1malloc,free 和new , 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 在释放空间前会调用析构函数完成 空间中资源的清理
7.2内存泄漏定义以及危害
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序 未能释放已经不再使用的内存 的情况。内 存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现 内存泄漏会导致 响应越来越慢,最终卡死。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu-server部署hive-part2-安装hadoop

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本:ubuntu-server-22.04.3 虚拟机:virtualbox7.0 安装hadoop ​​​​​​下载上传 下载地址 https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/ 以root用…

用C/C++加Easyx实现俄罗斯方块游戏(爆肝4万字,完全免费)

前言 相信大家一定玩过俄罗斯方块这款小游戏,简单容易上手是老少皆宜的小游戏,今天大家就跟着我来实现这个小游戏吧!让自己学的C语言有用武之地。 为了让俄罗斯方块的开发更为简单些,图像更为丰富,在这里就利用了Easyx…

设计模式总结-原型设计模式

原型设计模式 模式动机模式定义模式结构模式分析深拷贝和浅拷贝原型模式实例与解析实例一:邮件复制(浅克隆)实例二:邮件复制(深克隆) 模式动机 在面向对象系统中,使用原型模式来复制一个对象自…

vue使用iview导航栏Menu activeName不生效

activeName不生效 一、问题一、解决方案, 一、问题 根据ivew官网的提示,设置了active-name和open-names以后,发现不管是设置静态是数据还是设置动态的数据,都不生效 一、解决方案, 在设置动态名称的时候&#xff0c…

Centos7环境下安装MySQL8详细教程

1、下载mysql安装包 下载哪个版本,首先需要确定一下系统的glibc版本,使用如下命令: rpm -qa | grep glibc ​​​​​​​ 2、检查是否安装过mysql ps:因为以前用yum安装过,所以先用yum卸载。如果不是此方式或者没安装过则跳过…

基于SpringBoot Vue求职招聘系统

一、📝功能介绍 基于SpringBoot Vue招聘系统的设计与实现 角色:管理员、企业、用户 管理员:管理员进入主页面,主要功能包括对个人中心、企业管理、用户管理、岗位类型管理、招聘信息管理、应聘记录管理、留言反馈、系统管理等进…

笛子基础入门

文章目录 1.符号2. 笛子指法说明3. 曲谱3.1 年轮3.2 生生世世爱 1.符号 笛子简谱:由七个基本数字组成(1234567);高音在数字上面加一“.”,低音则在下面加一“.”,不加点则是中音;数字后面加横线…

Linux从入门到精通 --- 2.基本命令入门

文章目录 第二章:2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…

基于MPPT的风力机发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1风能与风力发电机模型 4.2风力机功率特性与最大功率点 4.3 MPPT 5.完整工程文件 1.课题概述 基于MPPT的风力机发电系统simulink建模与仿真。MPPT使用S函数编写实现。基于最大功率点跟踪&#xff08…

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者:高玉龙(元泊) 背景信息 随着数字化新时代的全面展开以及 5G 与物联网(IoT)技术的迅速普及,操作系统正面临前所未有的变革需求。在这个背景下,华为公司自主研发的鸿蒙操作系统&#xff08…

网络编程套接字应用分享【Linux C/C++ 】【UDP应用 | TCP应用 | TCP线程池小项目】

目录 前提知识 1. 理解源ip,目的ip和Macip 2. 端口号 3. 初识TCP,UDP协议 4. 网络字节序 5. socket 编程 sockaddr类型 一,基于udp协议编程 1. socket——创建套接字 2. bind——将套接字强绑定 3. recvfrom——接受数据 4. s…

基于jsp+Spring boot+mybatis的图书管理系统设计和实现

基于jspSpring bootmybatis的图书管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录,如需下载,请前往星球获取: 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

攻防世界 wife_wife

在这个 JavaScript 示例中,有两个对象:baseUser 和 user。 baseUser 对象定义如下: baseUser { a: 1 } 这个对象有一个属性 a,其值为 1,没有显式指定原型对象,因此它将默认继承 Object.prototype。 …

彩虹聚合DNS管理系统,附带系统搭建教程

聚合DNS管理系统,可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口&#xff0…

CSS设置字体样式

目录 前言: 1.font-family: 2.font-style: 3.font-weight: 4.font-size: 5.font-variant: 6.font: 前言: 在网页中字体是重要的组成部分,使用好字体可以让网页更…

17.应用负载压力测试

早些点,下午题考,最近几年出现的少; 备考较为简单;历年真题相似度高; 主要议题: 1.负载压力测试概述 注意这些测试细微的差别; 负载测试和压力测试的方法比较相似,但是目的不同&a…

HTML——5.表单、框架、颜色

一、表单 HTML 表单用于在网页中收集用户输入的数据&#xff0c;例如登录信息、搜索查询等。HTML 提供了一系列的表单元素&#xff0c;允许用户输入文本、选择选项、提交数据等。 <!DOCTYPE html> <html lang"en"> <head> <meta charset&q…

Git 如何去使用

目录 1. Git暂存区的使用 1.1. 暂存区的作用 1.2. 暂存区覆盖工作区&#xff08;注意&#xff1a;完全确认覆盖时使用&#xff09; 1.3. 暂存区移除文件 1.4. 练习 2. Git回退版本 2.1. 概念 2.2. 查看提交历史 2.3. 回退命令 2.4. 注意 3. Git删除文件 3.1. 需求 …

软件设计师-案例分析2

文章目录 除09-1520上-结构化分析20上-数据库分析20上-面向对象分析与设计 除09-15 20上-结构化分析 问题1&#xff1a; 问题2&#xff1a; 问题3&#xff1a; 问题4&#xff1a; 回答1&#xff1a;E1检测设备&#xff1b; E2管理员&#xff1b;E3检测业务员&#xff1b;…