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. 不释放动态开辟的空间,导致内存泄漏

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

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

相关文章

【数据结构】初识排序 直接插入排序

初识排序 & 直接插入排序 🐟排序在现实中的应用🐟排序的概念🐟常见的排序算法🐟直接插入排序💦举例--直接插入排序在现实种的应用💦单趟直接插入排序讲解💦直接插入排序算法 🐟排…

【android开发-11】android中创建自定义布局并引入自定义布局的参考例子

1,以下是在Android中创建自定义布局并引入自定义布局的参考例子: 首先,创建一个自定义布局文件。在项目的res/layout目录下创建一个新的XML文件,例如custom_layout.xml。在该文件中,您可以定义自定义的视图元素和布局…

应用于智慧零售的AI边缘计算盒子+AI算法软硬一体化方案

中国是世界上最大的消费市场,零售行业拥有极大的发展潜力,阿里、腾讯两大互联网巨头正在加紧、加大布局; 信迈智慧零售方案可涵盖快消行业、服饰行业、餐饮行业、酒店行业、美家行业、消费电子行业、新零售商行业、服饰连锁、大卖场/商超、百…

fastmock如何判断头信息headers中的属性值

fastmock可以快速提供后端接口的ajax服务。 那么,如何判断头信息headers中的属性值呢? 可以通过function中的参数_req可以获得headers中的属性值,比如 User-Agent,由于User-Agent属性带有特殊符号,因此使用[]方式而不…

生成式 AI 与数据融合:亚马逊云科技的前沿探索与应用

目录 前言1 生成式AI和数据2 亚马逊云科技的AI创新2.1 数据与生成式 AI 的协同创新2.2 多模态融合与创新驱动2.3 构建创新平台与工作智能助手2.4 数据整合与安全保障 3 生成式AI结合企业数据的典型技术Amazon Q4 展望未来 授权声明:本篇文章授权活动官方亚马逊云科技…

经典神经网络——ResNet模型论文详解及代码复现

论文地址:Deep Residual Learning for Image Recognition (thecvf.com) PyTorch官方代码实现:vision/torchvision/models/resnet.py at main pytorch/vision (github.com) B站讲解: 【精读AI论文】ResNet深度残差网络_哔哩哔哩_bilibili …

NXP iMX8M Plus Qt5 双屏显示

By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用,可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 Verdin iMX8M Plu…

Ubuntu18.04安装LVI-SAM保姆级教程

目录 1 LIO-SAM的安装前要求 1.1 ROS安装:参考我的另一篇博客 1.2 gtsam安装(参考LeGO-LOAM 1.2节) 2 安装

C++的explicit和隐式转换

隐式转换是指在某些情况下,编译器会自动进行类型转换,将一种类型的值转换为另一种类型,以满足表达式的要求。这种转换是隐式进行的,不需要显式地调用转换函数或构造函数。 int a 5; double b a; // int 到 double 的隐式转换上…

Doris 数据导入二:Stream Load 方式

Stream load 是一个同步的导入方式,用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 同步执行导入并返回导入结果。用户可直接通过请求的返回体判断本次导入是否成功。 1 适用场景 Stream load 主要适用于导入本地文件,或通过程序导入数据流中…

深入理解Java对象

1. 对象一定分配在堆上吗? 在Java中,对象的分配通常发生在堆(Heap)上,这是Java内存管理的一部分。然而,这个说法需要一些细化和额外的说明: 对象通常分配在堆上 堆内存:在Java中&…

支持Upsert、Kafka Connector、集成Airbyte,Milvus助力高效数据流处理

Milvus 已支持 Upsert、 Kafka Connector、Airbyte! 在上周的文章中《登陆 Azure、发布新版本……Zilliz 昨夜今晨发生了什么?》,我们已经透露过 Milvus(Zilliz Cloud)为提高数据流处理效率, 先后支持了 Up…

【Redis】Redis高并发高可用(主从复制、哨兵机制)

Redis高并发高可用 复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,后面章节的哨兵和集群都是在复制…

java类库的废弃API

java语言一直在进化,java类库也越来越庞大,给人的感觉是一直在做加法。 有没有做减法呢?当然也有,一些是设计失误需要撤回的,如可能引起线程安全问题的Thread.stop()等方法;还有是随着时代发展而被淘汰的&…

GameNetController网络控制器

好用的局域网内的网络控制器,稍作更改可连接互联网 using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using LitJson; using UnityEngine; u…

【数据结构】拆分详解 - 堆的应用

堆的应用 1. 堆排序 思路: 建大堆 向下调整建堆,根位置即选出的最大数 排序:交换头尾,向下调整,尾删 把大数移到尾部,调整堆,将排好的大数“删出”堆注意向下调整和尾删顺序不能对调&#xff0c…

cocos 关于多个摄像机,动态添加节点的显示问题,需要动态修改layer。(跟随摄像机滚动)(神坑官网也不说明一下)

参考文章:Cocos 3.x 层级Layer - 简书 2D镜头跟随应该怎么实现呢 - Creator 3.x - Cocos中文社区 关于多个摄像机,动态添加节点的显示问题,需要动态修改layer? 场景:在制作摄像机跟随角色移动功能时,新增…

Python 3 使用 read()、readline()、readlines() 函数 读取文件

1 样例文件 example.txt 春晓 孟浩然〔唐代〕 春眠不觉晓,处处闻啼鸟。 夜来风雨声,花落知多少。 2 分别使用 read()、readline()、readlines() 函数 2.1 # read() -------- 一次性读取所有文本,以字符串的形式返回结果。 # read() ----…

1.qml-3D入门讲解介绍

本章我们来学习QML 3D教程,QML 3D能够支持windows linux等多平台跨平台并且显示效果大部分一致,非常方便,学习的qt版本最低为qt6.5。 要使用qml 3D类,需要导入QtQuick3D模块。 这是使用空间渲染器和场景图的 QML 前端。目前&…

SQL Server 2016(分离和附加数据库)

1、实验环境。 基于上一个实验《SQL Server(创建数据库)》 2、需求描述。 class数据库的数据文件和事务日志文件都位于C:\db_class目录下。现在需要把class数据库的数据文件和事务日志文件分开存放,数据文件class.mdf存放于原位置&#xff0…