C-C++内存管理

C/C++内存分布

内存的分配方式有几种?

静态内存分配(Static Memory Allocation): 静态内存分配是在编译时确定内存大小和位置的分配方式。==全局变量、静态变量和常量都使用静态内存分配。==这些变量在程序的整个生命周期中都存在,直到程序结束。静态内存分配的优点是速度快,开销小;缺点是分配的内存大小在编译时就确定,不能在运行时改变。

栈内存分配(Stack Memory Allocation): ==栈内存分配是在函数调用期间为局部变量和函数参数分配内存的方式。==栈内存分配由编译器自动处理,无需程序员手动管理。栈内存分配速度快,但分配的内存大小受到栈大小的限制。当函数调用结束时,分配的内存会自动释放。

堆内存分配(Heap Memory Allocation): 堆内存分配是在程序运行期间动态分配和释放内存的方式。C++中,可以使用newdelete操作符(或new[]delete[]操作符)在堆上分配和释放内存。堆内存分配允许在运行时分配可变大小的内存,但分配和释放的速度相对较慢,且需要程序员手动管理内存的生命周期。不正确地管理堆内存可能导致内存泄漏或悬挂指针等问题。

**注意:**静态内存分配具体又可以分为:数据段(静态区)和代码段(常量区)

#include<iostream>using namespace std;// C/C++内存分布:能够理清楚下面的变量分属于哪个内存区域么?:栈-堆-数据段(静态区)-代码段(常量区)
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);
}

C语言内存管理方式

mallocfree 仅分配和释放内存,而不对内存内容进行初始化。在 C++ 中,newdelete 操作符不仅负责内存分配和释放,还负责对象的构造和析构。

//C语言内存管理
void Test2()
{int* p1 = (int*)malloc(sizeof(int));free(p1);// malloc/calloc/realloc的区别是什么?int* p2 = (int*)calloc(4, sizeof(int));//calloc会开辟空间后进行初始化赋值0int* p3 = (int*)realloc(p2, sizeof(int) * 10);//realloc是对开辟后的空间进行二次扩容// 这里需要free(p2)吗?// 1.不需要若p2和p3指向的是同一块内存空间则free一次空间即可 2.若realloc扩容的地址改变了那么编译器会自动拷贝p2中的内容到p3后自动freep2free(p3);
}

C++内存管理方式

newdelete 是 C++ 语言中用于在堆上分配和释放内存的操作符,它们不仅负责内存管理,还负责对象的构造和析构。

//C++内存管理
void Test3()
{// 动态申请一个int类型的空间int* ptr4 = new int;// 动态申请一个int类型的空间并初始化为10int* ptr5 = new int(10);// 动态申请10个int类型的空间int* ptr6 = new int[3];delete ptr4;delete ptr5;delete[] ptr6;
}
  • 注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]
  • 注意:匹配起来使用很重要!不匹配使用结果是不确定的:可能会存在报错,具体原因在于自定义类型下的析构函数的调用
  • 注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会

new与delete的实现原理

内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返NULL

自定义类型

  • 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来释
    放空间

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

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

相关文章

创建TextMeshPro字体文件

相比于Unity的Text组件&#xff0c;TextMesh Pro提供了更强大的文本格式和布局控制&#xff0c;更高级的文本渲染技术&#xff0c;更灵活的文本样式和纹理支持&#xff0c;更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…

React16源码: React中event事件对象的创建过程源码实现

event 对象 1 &#xff09; 概述 在生产事件对象的过程当中&#xff0c;要去调用每一个 possiblePlugin.extractEvents 方法现在单独看下这里面的细节过程&#xff0c;即如何去生产这个事件对象的过程 2 &#xff09;源码 定位到 packages/events/EventPluginHub.js#L172 f…

Spring事件之注解@EventListener讲解

文章目录 1 注解EventListener1.1 示例Demo1.1.1 简单例子1.1.2 解耦1.1.3 Spring事件 1.2 深入EventListener1.2.1 debug调试1.2.2 问题一&#xff1a; Spring是怎么知道要去触发这个方法1.2.3 问题二&#xff1a;ApplicationListenerMethodAdapter1.2.4 问题三&#xff1a;Si…

Vue学习笔记:计算属性

计算属性 入门进阶二次进阶三次进阶四次进阶结界五次进阶六次进阶七次进阶八次进阶九次进阶终章彩蛋 入门 Vue.js中&#xff0c;计算属性示例&#xff1a; export default {data() {return {firstName: John,lastName: Doe};},computed: {// 计算属性&#xff1a;全名fullNam…

(12)喝汽水

文章目录 每日一言题目解题思路一代码 解题思路二代码 结语 每日一言 长风沛雨&#xff0c;艳阳明月。田野被喜悦铺满&#xff0c;天地间充满着生的豪情。 题目 已知1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;输入整数n&#xff08;n>0&#xff09;&#x…

Maven工程的配置及使用

一、Maven章节 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具 1.1、maven的作用 1&#xff09;依赖管理&#xff1a; 方便快捷的管理项目依赖的资源包&#xff08;jar包&#xff09;避免版本冲突 2&#xff09;统一项目结构&…

机器学习算法之逻辑回归算法(Logistic Regression)

逻辑回归算法是一种用于分类问题的经典机器学习算法。虽然它的名字中带有“回归”,但实际上逻辑回归用于解决分类问题,特别是二分类问题。本篇博文将详细介绍逻辑回归算法的工作原理、应用领域以及Python示例。 算法背景 逻辑回归起源于20世纪初,用于分析生存率数据。随后…

Android studio打开md无法显示md渲染问题

Where is Android Studio Markdown support plugin preview preference? - Stack Overflow android studio开发无法选择markdown渲染功能的问题 原因是java runtime出了问题 搜索下面功能 Choose Boot Java Runtime for the IDE 选择带JCEF的 可以选最新的java版本 重启之…

Jvm FullGC 如何排查?

使用场景 我们在使用系统时&#xff0c;有时请求和响应会变得特别慢&#xff0c;系统也变得很卡。 有可能是FullGC的问题&#xff0c;可以逐步地进行排查。 使用jps和top确定进程号pid jps可以列出正在运行的jvm进程&#xff0c;并显示jvm执行主类名称( main()函数所在的类…

浙政钉(专有钉钉)

专有钉钉是浙政钉的测试版本&#xff0c;可在正式发布之前进行业务开发。 专有钉钉 原名政务钉钉 是高安全、强管控、灵活开放的面向大型组织专有独享的协同办公平台。支持专有云、混合云等多种方式灵活部署&#xff0c;以满足客户特定场景所需为目标&#xff0c;最大化以“平…

window 镜像---负载篇

前提&#xff1a;需要修改window的powershell执行脚本的策略 步骤&#xff1a;以管理员身份打开powershell&#xff0c;执行 Get-ExecutionPolicy查看当前执行策略&#xff0c;若返回值是Restricted&#xff0c;需执行Set-ExecutionPolicy RemoteSigned powershell 版本信息&am…

.NET Core已经开源好几年了, 为什么不像JVM那样很多人研究和调优其GC算法?

.NET Core的开源确实是微软近年来重要的一步&#xff0c;它不仅标志着.NET生态系统向更开放、更多样化的方向迈进&#xff0c;也为更广泛的社区参与和贡献提供了可能。然而&#xff0c;与JVM相比&#xff0c;研究和调优GC&#xff08;垃圾回收&#xff09;算法的工作似乎没有那…

gif格式图片是怎么做的?教你一招在线转换

常见的图片有jpg、png以及gif格式&#xff0c;其中&#xff0c;jpg和png格式的图片我们一般手机拍摄或是接受的都是这两种格式&#xff0c;但是gif格式的图片我们却需要从网上下载。那么&#xff0c;当我们想要自己制作gif动画的时候要怎么操作呢&#xff1f;只需要使用在线制作…

NDK Could NOT find OpenGL (missing: OPENGL_glx_LIBRARY) Ubuntu

1. update 该命令将安装一堆新包&#xff0c;包括gcc&#xff0c;g 和make。 sudo apt-get update sudo apt-get install -y build-essential2. install OpenGL依赖库 sudo apt-get install freeglut3-dev sudo apt-get install libgl1-mesa-dev sudo apt-get install libxt-…

MAE实战:使用MAE提高主干网络的精度(一)

摘要 MAE已经出来有几年了&#xff0c;很多人还不知道怎么去使用&#xff0c;本文通过两个例子说明一下。分两部分&#xff0c;一部分介绍一个简单的例子&#xff0c;让大家了解MAE训练的流程。一部分是一个新的模型&#xff0c;让大家了解如何将自己的模型加入MAE。 论文标…

【BBF系列协议】TR156 在TR101环境中使用GPON Access

TR-156 在TR-101环境中使用GPON Access 执行摘要 TR-101提供了一种基于以太网的体系结构,它已成为针对使用DSL作为宽带接入技术的住宅和企业客户的三联游戏部署的全球标准。然而,许多TR-101的体系结构规范都是与访问无关的,而且它们今天也与其他访问技术一起被广泛使用,特…

后端课程接口

路由&#xff1a;course/urls.py router.register(categories, views.CourseCategoryViewSet, categories) # 分类 router.register(free, views.CourseViewSet, free) # 课程视图&#xff1a;course/views.py from rest_framework.viewsets import GenericViewSet from re…

steam搬砖项目赚钱吗?操作流程看这一篇就够了

很多人应该听说过steam&#xff0c;它是国外一款知名的游戏社交平台&#xff0c;也是目前世界上最大的游戏平台之一。而steam搬砖项目&#xff0c;关键就是靠信息差。我们要做的就是在steam以低价买入道具装备&#xff0c;然后上架到网易buff卖出&#xff0c;赚取差价。 什么人…

【Mapstruct】MapStruct实战:简化Java Bean映射

虽然早就在用mapstruct了&#xff0c;但因为要快速原型开发&#xff0c;天天写builder模式&#xff0c;感觉太长了&#xff0c;不好看&#xff0c;&#xff08;然后最近被同事说丑了 &#xff09;&#xff0c;感觉还是做个总结&#xff0c;怒转mapstruct 问题背景或前提知识 …

【PLC一体机】PLC一体机中如何实现触摸屏和PC电脑的通讯

博主今天准备把之前买的PLC一体机拿出来玩一下&#xff0c;翻看以前的博文&#xff0c;发现没有记录分享PLC一体机中如何实现触摸屏程序下载的内容。 如之前博文介绍的那样&#xff0c;PLC一体机由PLC和触摸屏两部分集成的设备&#xff0c;因此设备内部已经做好了PLC和触摸屏之…