05 动态分配内存

OpenHarmony使用智能指针管理动态分配内存对象 智能指针是行为类似指针的类,在模拟指针功能的同时提供增强特性,如针对具有动态分配内存对象的自动内存管理等。自动内存管理主要是指对超出生命周期的对象正确并自动地释放其内存空间,以避免出现内存泄漏等相关内存问题。智能指针对每一个RefBase对象具有两种不同的引用形式。强引用持有对一个对象的直接引用。具有强引用关系的对象在该强引用关系存在时同样也应当存在,也即该引用关系有效;弱引用持有对一个对象的间接引用。具有弱引用关系的对象在该弱引用关系存在时并不保证存在。注意:上述描述仅当正确使用智能指针时才成立。 阅读详情

动态分配出来空间在堆里,如果动态分配出来的空间使用完成后不回收,只会在所属的进程退出,系统才会回收。如果进程一直不退,动态分配越来越多的空间,会引起系统可用内存不足,这就是内存泄漏。


注意:分配在堆里的空间,所在函数执行结束也不会自动回收分配在堆里的空间(会自动回收栈里分配的空间).只有调用回收函数或者进程退出才可以回收堆里分配的空间。


检查C/c++程序执行时是否有内存泄漏,可用命令:<valgrind 可执行文件>



1

2 #include<iostream>

3 #include<stdlib.h>

4

5 int main(void)

6 {

7 int *p;

8

9 p = (int*)malloc(sizeof(int)); // 只有动态分配,没有回收

10 return 0;

11 }


编译后,用命令检查:

[root@localhost05new_delete]# valgrind ./a.out

==7001== Memcheck, amemory error detector

==7001== Copyright(C) 2002-2013, and GNU GPL'd, by Julian Seward et al.

==7001== UsingValgrind-3.10.0 and LibVEX; rerun with -h for copyright info

==7001== Command:./a.out

==7001==

==7001==

==7001== HEAPSUMMARY:

==7001== in useat exit: 4 bytes in 1 blocks

==7001== totalheap usage: 1 allocs, 0 frees, 4 bytes allocated

==7001==

==7001== LEAKSUMMARY:

==7001== definitely lost: 4 bytes in 1 blocks

==7001== indirectly lost: 0 bytes in 0 blocks

==7001== possibly lost: 0 bytes in 0 blocks

==7001== stillreachable: 0 bytes in 0 blocks

==7001== suppressed: 0 bytes in 0 blocks

==7001== Rerun with--leak-check=full to see details of leaked memory

==7001==

==7001== For countsof detected and suppressed errors, rerun with: -v

==7001== ERRORSUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)


在代码里加上回收空间的处理

1

2 #include<iostream>

3 #include<stdlib.h>

4

5 int main(void)

6 {

7 int *p;

8

9 p = (int*)malloc(sizeof(int));

10

11 free(p);

12 return 0;

13 }


再编译,检查:

[root@localhost05new_delete]# valgrind ./a.out

==7519== Memcheck, amemory error detector

==7519== Copyright(C) 2002-2013, and GNU GPL'd, by Julian Seward et al.

==7519== UsingValgrind-3.10.0 and LibVEX; rerun with -h for copyright info

==7519== Command:./a.out

==7519==

==7519==

==7519== HEAPSUMMARY:

==7519== in useat exit: 0 bytes in 0 blocks

==7519== totalheap usage: 1 allocs, 1 frees, 4 bytes allocated

==7519==

==7519== All heapblocks were freed -- no leaks are possible

==7519==

==7519== For countsof detected and suppressed errors, rerun with: -v

==7519== ERRORSUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)




在C语言里用malloc函数动态分配空间,用free函数回收空间。

在C++语言里用new关键字动态分配空间,用delete关键字回收空间.


C++:

int *p, *p2 ;


//动态分配一个int型的变量空间

p = new int; // new 后面直接写类型

//动态分配一个int型的数组空间,数组元素个数为5

p2 = new int [5];



//回收空间

delete p;

delete [] p2; //回收连续的空间时,<delete>后需加上”[]”符号


注意:在c++里也是可以c里的malloc分配空间,free回收空间.但是建议还是改成使用C++的new与delete,因为它们有比malloc/free更多的功能.

new 会触发类的构造函数,delete会触发类的析构函数.而malloc/free是无法触发这些函数的.




c++里通常会用到一个词“对象”

对象其实就是分配出来的某种类型的具体空间.

如有类型,MyCls;

MyCls a; //a 就是对象

MyCls *a = newMyCls; // a指向对象.“new MyCls”创建出对象,并把地址给指针变量a存放起来.

建议尽量使用后面这种方法创建对象,这样比较安全.


鸿蒙内核源码分析 (内存池管理) | 如何高效切割合并内存块 请将内存池想成一条画好了网格虚线的大白纸,会有两种角色往白纸上画东西,一个是内核画管理数据,一个外部程序画业务数据,内核先画,外部程序想画需申请大小,申请成功内核会提供个地址给外部使用,例如申请20个格子,成功后内核返回一个(5,8)坐标,表示从第五行第八列开始往后的连续20个格子你可以使用。用完了释放只需要告诉内核一个坐标(5,8)而不需要大小,内核就知道回收多少格子。但内核凭什么知道要释放多少个格子呢 ? 一定有个格子给记录下来了对不对,实际中存大小的格子坐标就是(5,7)。其值是在申请的时候或更早的时 阅读详情

相关推荐

ESP8266/ESP32/RP2040西班牙语语音合成库:基于SAM共振峰合成

语音合成是嵌入式人机交互的关键技术,其主流实现包括波形拼接、参数化合成与端到端神经TTS。其中,参数化语音合成(如共振峰合成)以极低资源开销和确定性实时性著称,特别适用于MCU等内存受限场景。ESP8266SAM_ES正是这一技术路线的典型实践——它将经典SAM引擎逆向移植至ESP8266、ESP32及RP2040平台,采用五阶共振峰建模实现纯本地化西班牙语语音生成,全程无需网络或浮点运算。该方案在工业HMI、教育IoT与复古计算复刻中展现出独特价值,尤其契合对功耗、版权合规与离线可靠性有严苛要求的应用。本

weixin_29041443的博客 272

动态分配的内存在进程结束后会被操作系统回收吗?

首先答案是:会。 这是当时在华为培训班的时候遇到的一个问题。很多同学本着C++没有内存回收的理论认为不会被回收。而我本着操作系统设计的时候就会考虑到这一点,所以大多数现代操作系统一定会回收。这是一个需求决定的机制,而不是由于语言的限制。 我是这样分析的: 1.操作系统是对于硬件的抽象。也就是说再没有操作系统的时候程序直接和机器打交道,而有了操作系统以后程序以为是很机器打交道,其实是在和操作系

WALLEZhe的博客 4240

C语言动态分配二维数组空间

方法二: 当成一维数组来分配。方法一: 指针的指针。

h a 6 6 6 c k 为 你解决复杂难题! 1111

c/c++笔试题(2)(转载的)

c/c++笔试题(2)(转载的) 1.尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么? 这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是P.J.Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!

嵌入式世界的专栏 1051

零基础学会制作 基于STM32/51单片机的智能血压表设计/血压表/血压计

本系统是以单片机为主控,传感器模快、显示模块、人机交互、无线传输等组成的智能血压表设计。传感器用于测量血压和脉搏,主控电路板用于处理数据和控制设备,显示屏则用于显示测量结果。通过软件设计,完成测量数据的处理,其中血压和脉搏的测量、数据的分析和处理等。

weixin_55654459的博客 2473

【AIGC】COT思维链:让AI学会拆解问题,像人一样思考

COT思维链的出现,为AI的发展开辟了一条新的道路。它让AI学会了像人类一样思考,将复杂问题分解成简单的步骤,并逐步推理出最终答案。希望我的引导会对你产生启发。

智兔唯新的博客 9002

面试题(嵌入式经典)

1. 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。 #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) &lt;= (B) (A) : (B)) 3. 预处理器标识#error的目的是什么? ...

linuxweiyh的博客 2879

STM32在六轴机械臂实时控制中的选型与分层架构设计

嵌入式实时控制系统中,微控制器的选型直接决定运动控制精度与系统可靠性。其核心在于匹配确定性中断响应、低延迟外设协同与工业协议栈支持等硬性指标。STM32凭借Cortex-M内核的NVIC调度能力、成熟HAL库及CAN FD/高级定时器等专用外设,在机电一体化场景中成为伺服控制中枢的首选。相比ESP32等通用MCU,STM32在硬实时性、EMC认证生态和工业总线兼容性上具备不可替代优势。本文围绕GTB六轴机械臂项目,详解基于STM32F407的硬件抽象层配置、FreeRTOS任务调度、事件队列解耦及闭环控制数

jupi8的博客 754

嵌入式经典面试题(转)

C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。    从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不是在嵌入式

finewind的专栏 1082

【STM32H7实战】SDMMC总线优化与FatFs文件系统高效读写技巧

本文详细介绍了STM32H7中SDMMC总线优化与FatFs文件系统高效读写技巧,包括时钟配置、DMA传输、缓存策略等关键优化点。通过实测数据对比,展示了从2.7MB/s提升至11.8MB/s读取速度的优化效果,适用于需要高性能SD卡读写的嵌入式开发场景。

e6f7g8h9i的博客 483

PCL 均匀采样【2026最新版】

根据输入点云数据创建一个微小的三维立方体集合,然后计算每个三维立方体的重心;由于该重心点不一定是原始点云中的点,直接用该点来表示立方体内所有的点会丢失原始点云的细小特征;所以使用k最近邻搜索寻找距离重心点最近的原始点来代替重心点。

点云侠的博客 41万+

最全嵌入式面试常问问题_嵌入式系统面试问答(1),2024年最新腾讯T3面试官透露

答:预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译1、 总是使用不经常改动的大型代码体。

2401_84925367的博客 385

从零开始学习PX4源码23(飞行模式管理)

本文摘要主要介绍了PX4飞控系统中飞行模式管理模块的代码实现流程。文章从整体架构入手,分析了飞行模式管理模块的启动过程、类继承关系以及核心运行机制。重点阐述了模块从rc.mc_apps启动脚本到FlightModeManager::main()的调用链路,包括任务创建、工作队列初始化和主循环执行流程。核心部分解释了Run()函数如何通过订阅传感器数据、更新参数、处理命令以及生成轨迹设定点来实现飞行模式切换和任务管理功能。文章为理解PX4飞行控制系统的模式切换机制提供了代码层面的详细分析。

陌城烟雨 499

c语言给二维数组动态分配内存

这三种方法各有优缺点:方法 1:内存分配灵活,但不连续。方法 2:内存分配连续,但访问复杂。方法 3:结合了两者的优点,既连续又方便访问。根据具体需求,选择适合的内存分配方式。

weixin_45888172的博客 1086

推理引擎终极对决:TensorRT vs ONNX Runtime,YOLOv8速度差30%的核心原因与实操指南

若你使用NVIDIA GPU,且追求极致速度和低延迟,TensorRT是唯一选择,尤其是边缘设备和实时场景;若你需要跨硬件部署、快速验证原型,或预算有限(无需NVIDIA GPU),ONNX Runtime是性价比之王;对于YOLOv8这类检测模型,TensorRT的FP16/INT8量化是“免费的速度提升”,建议优先采用。最后提醒:推理引擎的优化是“细节决定成败”——同样的引擎,不同的预处理方式、显存配置、批大小,都会导致10%-20%的性能差异。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1026

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 866

c++ 自己造一个vector(动态分配内存)

在写c++ vector的时候,有没有想过:他好像无穷无尽呢?那么他是怎么实现的呢?动态分配:int *a= new int;

我是Python虫!!! 645

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

在C++中,哪些场景需要手动释放内存

在 C++ 中,手动管理内存和资源的责任可以很广泛。虽然现代 C++ 提供了智能指针和 RAII 技术来减少手动资源管理的需求,但在某些低层次编程和性能关键的应用中,手动管理内存和资源仍然是必不可少的。确保正确释放这些资源对于避免内存泄漏和其他资源管理问题至关重要。

aichu6610的博客 1143

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

顺序表的顺序表示—动态分配

顺序表的顺序表示-动态分配空间

R先生专栏 401

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言数据在内存中的存储

C语言数据在内存中的存储是一个复杂而精细的过程,它涉及数据类型、内存分配、字节序、数据转换、内存管理、内存对齐、内存模型等多个方面。理解和掌握这些概念对于编写高效、可靠、可维护的C语言程序至关重要。通过本文的详细解析,希望读者能够对C语言数据在内存中的存储有一个更全面、更深入的理解。

Chujun123528的博客 806

内存基础原理和使用方法【c++】

静态内存用于存储全局变量和静态变量,这些变量在程序运行期间保持可用状态。它们在数据段中分配,生命周期从程序启动到结束。通过使用静态内存,开发者可以有效管理数据的持久性和全局可见性,这在许多场景中是非常有用的。堆内存提供了灵活的动态内存管理能力,但它也带来了复杂的内存管理责任。通过遵循最佳实践,如使用智能指针、及时释放内存、避免双重释放和悬空指针,可以有效减少内存管理问题,确保程序的稳定性和效率。

763

C语言内存动态分配与释放

一、内存分配 对于内存的分配,主要采用的是标记法。 分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配。例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配。 另一种方法是动态分配,动态分配是指程序在运行时为它分配内存。 分配内存的时候,对于已分配的内存,操作系统会给一个标记,未分配的内存,操作系统也会有一个标记,操作系统辨别内存是否可...

weixin_30736301的博客 179

C++ 数据语义学——进程内存空间布局

当把一个可执行文件加载到内存后,就变成了一个进程。

慢慢记录,慢慢更新。 680

C++ 26 之 深拷贝和浅拷贝

c26深拷贝和浅拷贝.cpp。

LSG_Dawn的博客 235

踩内存问题

解决方法:确保在所有退出路径上释放内存。解决方法:在释放后将指针设为NULL。解决方法:确保索引值在数组范围内。2.使用释放后的指针。

qq_44496518的博客 253
上一篇: 04 函数重载
下一篇: 06 class与struct
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值