【从小白到大白05】c和c++内存管理

news2025/3/13 2:36:22

c和c++内存管理

image-20221022150510788

文章目录

  • c和c++内存管理
  • c++内存管理方式
      • new/delete操作内置类型
        • new申请动态空间
        • delete释放空间
      • new和delete操作自定义类型
      • operator new与operator delete函数
    • new[]和delete[]
    • 定位new(placement-new)
      • 总结以上
    • 内存泄露
        • 以上就是全部内容啦,如果有你对哪点不清晰或者有问题的话,请在评论下留言,我会尽我所能答复哒

c和c++的大致内存分配如图所示:

image-20221015120533944

1.栈又称堆栈—存放非静态局部变量、函数参数、返回值等等,另外栈是向下增长的。

函数调用时创建,函数结束即销毁。(即用即取)

2.内存映射段—高效的I/O映射方式,用于装载一个共享的动态内存库,用户可以使用系统接口

创建共享内存,做到进程中通信。

3.堆—用于程序运行时动态内存分配,另外堆是向上增长的。

4.数据段—用于存储全局数据和静态数据

**5.代码段—可执行代码或只读变量。**然而平时咱们敲的代码(在编译器上)是存在文件里(磁盘)。–这里别搞混啦!

代码在电脑上跑起来时会生成一个.exe文件,运行它时会形成进程,进程会向操作系统申请虚拟进程内存空间。原先在32位操作系统下的32位程序:指针大小为4byte,那么虚拟进程内存空间大约为4G(232byte);而到后来的科技发展到32位操作系统已经满足不了人们的需求,则又有了现在广泛运用的64位操作系统下的64位程序:指针为8byte,那么虚拟进程内存空间大约为232*4G(2^64byte)

【1G=1024MB=1024*1024KB=1024 *1024 *1024byte约等于2^30byte】

第一个空间—(0x00000000)—空指针

c++内存管理方式

new/delete操作内置类型

new申请动态空间

image-20221015141613547

image-20221015141745173

delete释放空间

int main()
{
	int* ptr1 = new int;//动态申请一块int类型的空间--没有初始化
	delete ptr1;
	int* ptr2 = new int(1);//动态申请一块int类型的空间--初始化为1
	delete ptr2;
	int* ptr3 = new int[10];//动态深10块int类型空间--没有初始化
	delete ptr3;
	int* ptr4 = new int[10]{ 1,2,3,4,5 };
	动态深10块int类型空间--初始化为1,2,3,4,5其余自动初始化为0
	delete ptr4;
	return 0;
}

new和delete操作自定义类型

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

image-20221015142716246

注意:new和delete必须要配对出现!

第一种情况:我new了一个自定义类型,然而delete了一组自定义类型—没有报错然而死循环了!

image-20221015143142092

第二种情况:我new了一个自定义类型,然而delete了一组自定义类型,但是我把析构函数屏蔽掉了—没有报错正常运行!

image-20221015143336755

第三种情况:我new了一个自定义类型,然而free了一个自定义类型—没有报错正常运行!

image-20221015143618079

但是你并不知道在不报错的时候会发生什么,比如内存泄露等等

第三种情况:我new了10个对象,然而只delete一个对象—会报错

image-20221015144636118

然而我把析构函数屏蔽掉则不会报错—正常运行!

image-20221015144812029

所以我们在使用new和delete的时候一定要匹配阿!!!

operator new与operator delete函数

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

operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败则尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常

operator delete: 该函数最终是通过free来释放空间的

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:

new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

new[]和delete[]

前提:

new的原理:调用operator new函数申请空间;在申请空间上调用构造函数完成初始化;

delete的原理:在空间上调用析构函数完成对对象资源的清理;调用operator delete函数释放对象的空间

所以同样的也有:

new对象[N]的工作原理:newA [N]调用operator new[]函数,实际上operator new[]函数是调用了operator new函数完成N个对象的空间申请;在申请空间上调用N次构造函数完成N个对象的初始化;

delete[N]的工作原理:调用N次析构函数完成对对象资源的清理;delete[N]函数调用了operator delete[]函数,实际上是operator delete[]函数调用了operator delete函数来对对象释放空间;

image-20221022131825099

这里贴一份代码后续要用到噢~

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "调用构造-A()" << endl;
	}

	~A()
	{
		cout << "调用析构函数-~A()" << endl;
	}
private:
	int _a;
};

int main()
{
	A* p2 = (A*)malloc(sizeof(A));
	if (p2 == nullptr)
	{
		perror("malloc fail");
		exit(-1);
	}
	new (p2)A(1);
	p2->~A();
	free(p2);
	return 0;
}

定位new(placement-new)

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

image-20221022142225073

定位new表达式:new(对象)构造函数(参数:用来初始化,不用初始化可以不写)

比如:new(p2)A(1)

image-20221022133448320

总结以上

mallocfreenewdelete
共同点从堆上申请空间,并且需要手动释放——从堆上申请空间,并且需要手动释放
不同点是函数是函数是操作符是操作符
申请空间时,需要手动计算大小不需要计算大小,new后接类型[个数]——
返回值void*,返回时需要强转——后接类型
申请空间时要判空,申请失败时返回NULL——不需要判空,但失败会抛异常
申请自定义类型时只会申请开辟空间,不会初始化只会释放空间不仅会开辟空间,还会调用对象的构造函数初始化会调用对象的析构函数完成对象资源的清理然后释放空间

内存泄露

内存泄漏指:**因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。**内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。(进程结束前泄露-对某块空间无法使用-比如失去指向这块内存的指针,进程结束后内存还给操作系统)

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

内存泄漏会导致响应越来越慢,最终卡死。(不怕突然泄露,就怕不知不觉之间泄露小部分空间,长时间累积导致系统变卡顿-温水煮青蛙)

相当于我们生病,不怕急性病(当前医疗环境好的情况下),就怕慢性病(不知不觉就养成癌症),所以我们程序员要坚持每天运动,不要熬夜啦!

以上就是全部内容啦,如果有你对哪点不清晰或者有问题的话,请在评论下留言,我会尽我所能答复哒

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

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

相关文章

WPS-JS宏开发-基础知识-03-三大基本结构

系统&#xff1a;Windows 11 软件&#xff1a;WPS表格11 本系列介绍一款类Excel的软件&#xff0c;WPS表格当然也是介绍其宏开发&#xff0c;不同的是&#xff0c;使用的JS宏会同样介绍多个系列&#xff0c;本系列介绍一些基础知识 Part 1&#xff1a; 三大逻辑结构 一个具体的…

如何给字符串字段加索引?

1.引例 现在的系统中&#xff0c;很多都会包含邮箱字段&#xff0c;那要如何给这个字段建立索引呢&#xff1f; 假设&#xff0c;现在维护了一个用户表&#xff0c;其中包含邮箱&#xff0c;定义如下&#xff1a; mysql>create table SUser(ID int primary key,email var…

OpenGL之多边形偏移、雾效、纹理映射

1.1 OpenGL中可以设置物体的点、线、面绘制模式。如果需要同时绘制多种模式&#xff0c;如下以面和线模式绘制两遍模型&#xff0c;可以看到线不连续&#xff0c;当镜头推远推近时会出现闪烁现象。 void glPolygonMode(GLenum face,GLenum mode);face :GL_FRONT&#xff0c;GL…

分治暴力求解最近点对问题 + 时间性能量化分析

Catalogue1 Intro2 Problem3 Time performance analysis4 Solution5 Reference1 Intro 本文旨在讨论分治和暴力在求解最近点对问题时的时间性能问题&#xff0c;关于解题部分不做过多讲解&#xff0c;只附上相关代码。 2 Problem 给定平面上N个点&#xff0c;找出其中的一对…

【Linux】第七章 进程控制(进程创建+进程终止+进程等待+进程替换+min_shell)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

【路径规划-多式联运】基于遗传算法求解多式联运运输问题(考虑碳交易)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

字符串和编码那些事

一、字符编码 1. ASCII字符编码 因为计算机只能处理数字&#xff0c;如果要处理文本&#xff0c;就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特&#xff08;bit&#xff09;作为一个字节&#xff08;byte&#xff09; 由于计算机是美国人发明的&#…

【Apache Spark 】第 11 章使用 Apache Spark 管理、部署和扩展机器学习管道

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

编程神器Copilot逐字抄袭他人代码?

自面世后就饱受争议的 GitHub Copilot 编程神器最近又遭遇舆论风暴。 日前,德州农工大学的一位计算机科学教授 Tim Davis 在推特上发文称, GitHub Copilot 在没有标注来源也没有 LGPL 许可的情况下,输出了大量应该受版权保护的代码。 Tim Davis 还发了自己和 GitHub Copil…

90后汕头返种水稻 国稻种芯·中国水稻会:广东新农人田保姆

90后汕头返种水稻 国稻种芯中国水稻会&#xff1a;广东新农人田保姆 南方日报 张伟炜 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#xff1a;“5月稻谷病虫害防护非常…

机器学习(周志华)课后习题

第1章 绪论 1.1 表1.1若只包含编号1和4的两个样例&#xff0c;试给出相应的版本空间。 版本空间&#xff1a;与训练及一致的假设集合。 色泽青绿&#xff0c;根蒂*&#xff0c;敲声*&#xff1b; 色泽*&#xff0c;根蒂蜷缩&#xff0c;敲声*&#xff1b; 色泽*&#xff0c;根…

nuxt.js 进行项目重构-首页

nuxt.js 也是基于vue 的 那么就离不开组件化开发 我们按照组件结构来进行分析 navTop 页面的头部 通用组件 分隔了三个位置 适用于大多数头部 且预留插槽 <template><div class"nav-top"><div class"left"><slot name"left…

Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用

1、操作术语 1.1、连接点 类里面哪些方法可以被增强、这些方法被称为连接点。比如&#xff1a;用户控制层有登录、注册、修改密码、修改信息等方法。假如只有登录类和注册类可以被增强&#xff0c;登录和注册方法就称为连接点 1.2、切入点 实际被真正增强的方法&#xff0c…

C++ 【UVA488】Triangle Wave

&#x1f4cb; 个人简介 &#x1f496;大家好&#xff0c;我是2022年3月份新人榜排名第三的 ༺Blog༒Hacker༻ &#x1f389;支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4ac;格言&#xff1a;༺永做优质༒programmer༻ &#x1f4e3; 系列专栏&am…

Unity技术手册-编辑器基础入门万字大总结

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 本文约8千字&#xff0c;新手阅读需要20分钟&#xff0c;复习需要12分钟 【收藏随时查阅不再迷路】 &#x1f449;关于作者 众所周知&…

【C/C++】程序环境,探索程序的执行过程(习得无上内功《易筋经》的第一步)

目录1.程序的翻译环境和执行环境2.详解编译链接2.1翻译环境2.2编译本身也分为几个阶段预编译&#xff08;预处理&#xff09;编译汇编详解符号表形成符号表2.3.链接合并段表符号表的合并和重定位3.运行环境总结&#xff1a;1.程序的翻译环境和执行环境 在ANSIC&#xff08;标准…

LeetCode每日一题——1235. 规划兼职工作

LeetCode每日一题系列 题目&#xff1a;1235. 规划兼职工作 难度&#xff1a;困难 文章目录LeetCode每日一题系列题目示例思路题解题目 你打算利用空闲时间来做兼职工作赚些零花钱。 这里有 n 份兼职工作&#xff0c;每份工作预计从 startTime[i] 开始到 endTime[i] 结束&a…

1024程序员节|基于Springboot实现爱心捐赠管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;BS-XX-…

Mybatis-plus学习(基于版本3.0.5)

文章目录一.概念1.1 简介1.2 特性二.快速入门三.CRUD扩展3.1 Insert插入3.2 主键生成策略3.3 Update更新3.4 自动填充3.5 乐观锁3.6 查询操作3.7 删除操作3.8 性能分析插件&#xff08;新版本的Mybatis-plus已将此插件移除&#xff09;3.9 条件构造器3.10 代码生成器一.概念 1…

Transformer合集3

太多了 我都累了 这都第4了 这次先是关于他的小样本目标检测 , 用很少的训练示例检测新目标 小样本目标检测 论文地址&#xff1a; https://openaccess.thecvf.com/content/CVPR2022/papers/Han_Few-Shot_Object_Detection_With_Fully_Cross-Transformer_CVPR_2022_paper.…