C/C++ 内存管理(1)

文章目录

  • C/C++ 内存划分
  • 静态和动态内存
  • C语言的动态内存分配函数
    • malloc
    • free
    • calloc
    • realloc
  • 常见内存使用错误

C/C++ 内存划分

  1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结
    束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是
    分配的内存容量有限
    。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返
    回地址等。
  2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分
    配方式类似于链表。
  3. 数据段/静态区 :存放全局变量静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体、类成员函数和全局函数 的二进制代码 、 存放常量。
    在这里插入图片描述

静态和动态内存

静态内存: 静态内存是在程序编译时分配的内存,它的生命周期从程序开始运行到程序结束。静态内存分为两种类型:全局变量静态变量

全局变量:全局变量是在所有函数之外定义的变量,它在程序启动时就被分配内存,直到程序结束才被释放。全局变量在整个程序中都可以访问,其作用域是整个程序。

静态变量:静态变量是在函数内部定义的变量,但是使用static关键字修饰。静态变量的生命周期与全局变量相同,但是其作用域仅限于定义它的函数内部。静态变量在函数调用结束后仍然保持其值,不会被销毁。

C语言的动态内存分配函数

malloc

void* malloc(size_t size);

malloc函数接受一个参数size,表示需要分配的内存大小(以字节为单位),并返回一个指向分配内存起始地址的指针。如果分配成功,则返回的指针指向一块连续的、未初始化的内存空间;如果分配失败,则返回NULL。

free

void free (void* ptr);

free函数接受一个参数ptr,表示需要释放的内存空间的起始地址。通过调用free函数,可以将之前通过malloc、calloc或realloc函数分配的内存空间释放回系统,以便系统可以重新利用这些内存空间。

calloc

void* calloc (size_t num, size_t size);

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。

realloc

void* realloc (void* ptr, size_t size);

ptr是指向之前分配的内存块的指针,size是新的内存块大小。返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间

realloc函数会根据新的大小重新分配内存,并返回一个指向新内存块的指针。如果分配失败,则返回NULL。

realloc函数有以下几种情况:

扩大内存块:如果新的大小大于之前分配的内存块大小,realloc函数会尝试将内存块扩大到新的大小,并返回指向新内存块的指针。如果内存扩大失败,则返回NULL,原内存块仍然有效。

缩小内存块:如果新的大小小于之前分配的内存块大小,realloc函数会尝试将内存块缩小到新的大小,并返回指向新内存块的指针。如果内存缩小失败,则返回指向原内存块的指针,原内存块仍然有效。

释放内存块:如果新的大小为0,realloc函数会释放之前分配的内存块,并返回NULL。

关于扩大内存块的方式又可以分为两种情况:

情况1: 原有的指针指向的内存空间后有连续的未使用空间则直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2: 原有的指针指向的内存空间后无连续的未使用空间。则在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。
在这里插入图片描述

常见内存使用错误

  1. 对NULL指针的解引用操作
  2. 对动态开辟空间的越界访问
  3. 对非动态开辟内存使用free释放
  4. 使用free释放一块动态开辟内存的一部分
void test()
{
 int *p = (int *)malloc(100);
 p++;
 free(p);
}
  1. 对同一块动态内存多次释放
  2. 不释放动态开辟的空间,导致内存泄漏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

92基于matlab的引力搜索算法优化支持向量机(GSA-SVM)分类模型

基于matlab的引力搜索算法优化支持向量机(GSA-SVM)分类模型,以分类精度为优化目标优化SVM算法的参数c和g,输出分类可视化结果及适应度变化曲线。数据可更换自己的,程序已调通,可直接运行。 92 引力搜索算法…

mysql的InnoDB存储引擎

详情请参考:https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html InnoDB 是一个通用目的的存储引擎,它在高可用性、高性能方面做了平衡。MySQL 8.0,InnoDB 是默认的存储引擎。在创建表的时候,如果没有使用ENGIN…

vmware 安装 AlmaLinux OS 8.6

选择系统镜像 选择镜像 选择安装位置和修改名称 可以自定义硬件,也可以不选择,后面可以再设置 自定义硬件可以设置内存和cpu等信息 安装虚拟机系统 密码如果简单的话需要点击两次done 才能保存

STM32 定时器TIM

单片机学习 目录 文章目录 前言 一、TIM简介 二、STM32的三种定时器 2.1基本定时器 2.1.1定时中断功能 1. 时钟源 2. 预分频器 3. 计数器 4. 自动重装寄存器 5.更新中断和更新事件 2.1.2主模式触发DAC功能 2.2 计数模式 2.2通用定时器 2.2.1 时钟源 外部时钟模式2 外部时钟模式…

使用PCReg.PyTorch项目训练自己的数据集进行点云配准

项目地址: https://github.com/zhulf0804/PCReg.PyTorch/tree/main 网络简介: 网络是基于PointNet Concat FC的,它没有其它复杂的结构,易于复现。因其简洁性,这里暂且把其称作点云配准的Benchmark。因作者源码中复杂…

项目实战之RabbitMQ死信队列应用

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 文章目录 🌟架构图&#x…

SpringMVC入门详解

SpringMVC概述 开始之前了解一下三层架构 在JavaEE中我们现在几乎全用的是B/S架构,也就是浏览器 / 服务器架构,在B/S架构中,系统包括标准的三层架构模式: 1.web层(表现层) 它负责接收客户端请求&#x…

SIP协议在语音通信的应用方式及OKCC系统中的配置方法

在企业语音通信的过程中,SIP协议支持的网络通信技术通过网络为用户提供了无数的通信便利,已成为企业不可或缺的重要通信技术。由于SIP协议是语音通信帮助企业实现这些优势的原因,因此了解支持这些呼叫的SIP协议的上下文至关重要。 什么是SI…

服务器和Linux ,安装R rstudio ,常用软件

服务器的基本概念: 如服务器的基本结构,节点,端口的概念等。 服务器的基本设置和管理: 如何配置新服务器, 如何管理服务器,如何分配账户并确保他们互不访问, 如何全局安装软件让所有人都可以…

【数据结构】 堆排序与TopK问题详解

在学习完堆的创建后,就轮到了标题的两个问题 这两个问题在实际生活中会有比较强的实际问题解决能力 先分别解释一下 堆排序: 运用堆的思想进行排序,时间复杂度为O(NlogN)TopK: 从一大堆数据中选择K个最大或最小的数据&#xff0c…

如何本地搭建个人hMailServer邮件服务并实现远程发送邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

了解c语言中的结构体

介绍: 在C语言中,结构体是一种用户自定义的数据类型,它允许我们将不同类型的数据组合在一起,形成一个更为复杂的数据结构。结构体可以用来表示现实世界中的实体,如人员、学生、图书等。本篇博客将介绍结构体的基本概念…

Postgresql分区表

PostgreSQL 提供了三种分区表实现方式: range :范围分区list :列表分区hash :哈希分区 一、范围分区 根据某个字段的值,将数据存入不同的分区表中。 创建父表 create table test_person_table (name varchar(64),ag…

SpringSecurity工作原理

实现功能就是继承这几个对应功能的类。 大概工作流程 Spring Security 的过滤器(Filters)和拦截器(Interceptors)是 Spring Security 框架中用于保护 web 应用安全的重要组件。它们在处理 HTTP 请求时扮演不同的角色&#xff0c…

【动态规划】LeetCode-62.不同路径

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…

vue 中 mixin 和 mixins 区别

目录 前言 用法 全局Mixin 局部Mixin 代码 理解 高质量的Mixin使用 在Vue.js框架中,Mixin是一种非常重要和强大的功能,它允许开发者创建可复用的代码片段,并将其应用到一个或多个组件中。Vue提供了两种方式来使用Mixin,分别…

以太网PHY,MAC接口

本文主要介绍以太网的 MAC 和 PHY,以及之间的 MII(Media Independent Interface ,媒体独立接口)和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看,以太网接口电路主要由MAC(M…

OpenTelemetry系列 - 第4篇 OpenTelemetry K8S生态

目录 一、【Helm】添加OTel Helm repo二、【Helm Chart】OTel Collector2.1 daemonset2.2 deloyment 三、【K8S Operator】OTel Operator3.1 安装OTel Operator3.2 部署OpenTelemetryCollector3.2.1 Deloyment Mode3.2.2 DeamonSet Mode3.2.3 StatefulSetMode3.2.4 Sidecar Mod…

Matlab R2022b 安装成功小记

Matlab R2022b 安装成功小记 前言一、 下载链接二、 安装过程小记 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧! 前言 windows 10系统之前安装过Matlab R2010b做基础研究,最…

【高效开发工具系列】Hutool Http工具类

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…