当前位置: 首页 > article >正文

C++动态内存/内存管理

文章目录前言一、内存分区二、C 语言动态内存标准库函数1.核心函数2.代码示例3.关键注意点三、C 动态内存关键字 / 操作符1.核心用法1单个对象2数组对象3类对象2.实现原理1内置类型2自定义类型3.关键特性四、区别栈区 vs 堆区C/C 动态内存--核心区别五、常见错误前言动态内存是程序手动在堆区申请、使用、释放的内存区别于栈区内存的自动管理是 C/C 核心考点和开发必备知识点。整体分为C 语言动态内存和C 动态内存两大体系核心围绕内存分配、释放、常见错误、最佳实践展开。一、内存分区程序运行时内存分为 4 个区域动态内存仅存在于堆区栈区局部变量、函数参数系统自动分配 / 释放空间小、连续、速度快。堆区动态内存手动申请 / 释放空间大、不连续、速度慢易产生内存碎片。全局 / 静态区全局变量、static变量程序结束后系统释放。常量区字符串常量、const 常量只读不可修改。二、C 语言动态内存标准库函数依赖stdlib.h头文件核心 4 个函数malloc/calloc/realloc/free成对使用手动管理。1.核心函数函数语法功能特点mallocvoid* malloc(size_t size)申请指定字节数的堆内存不初始化内存返回void*失败返回NULLcallocvoid* calloc(size_t num, size_t size)申请num个size大小的内存自动初始化为 0参数拆分更直观reallocvoid* realloc(void* ptr, size_t new_size)调整已分配内存的大小原地扩容 / 异地扩容ptrNULL等价mallocfreevoid free(void* ptr)释放堆内存无返回值仅能释放堆内存free(NULL)安全2.代码示例#include stdio.h #include stdlib.h int main() { // 1. malloc申请4字节int内存强转类型 int* p1 (int*)malloc(sizeof(int)); if (p1 NULL) { // 必须判断防止分配失败 perror(malloc fail); return 1; } *p1 10; // 2. calloc申请5个int初始化为0 int* p2 (int*)calloc(5, sizeof(int)); // 3. realloc扩容为10个int int* p3 (int*)realloc(p2, 10 * sizeof(int)); if (p3 ! NULL) p2 p3; // 扩容成功更新指针 // 4. 释放内存后置空避免野指针 free(p1); free(p2); p1 p2 NULL; return 0; }3.关键注意点必须强转类型malloc返回void*需转为目标指针类型必须判断返回值分配失败返回NULL直接使用会崩溃free仅释放堆内存不能释放栈指针释放后指针必须置NULL。三、C 动态内存关键字 / 操作符C 兼容 C 的malloc/free但推荐专用的new/delete、new[]/delete[]依赖 C 语法特性更安全、更面向对象。1.核心用法1单个对象// 申请int内存无初始化 int* p1 new int; // 申请初始化推荐 int* p2 new int(10); // 释放单个对象 delete p1; delete p2;2数组对象// 申请5个int的数组不初始化 int* arr new int[5]; // 释放数组必须用delete[] delete[] arr;3类对象new自动调用构造函数delete自动调用析构函数malloc/free无此功能class Test { public: Test() { cout 构造 endl; } ~Test() { cout 析构 endl; } }; Test* t new Test; // 调用构造 delete t; // 调用析构2.实现原理1内置类型如果申请的是内置类型的空间new和mallocdelete和free基本类似不同的地方是new/delete 申请和释放的是单个元素的空间new[] 和delete[] 申请的是连续空间而且new 在申请空间失败时会抛异常malloc会返回NULL。2自定义类型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 来释放空间3.关键特性类型安全无需强转自动返回目标类型指针自动计算大小无需手动写sizeof失败处理分配失败抛出bad_alloc异常而非返回NULL严格配对new↔delete、new[]↔delete[]不可混用。operator new/deletenew 底层调用 operator new后者通过 malloc 申请空间失败时抛异常而非返回 NULLdelete 底层调用 operator delete最终通过 free 释放空间。定位 new在已分配的原始内存中显式调用构造函数用于内存池场景内存池分配的内存未初始化自定义类型需手动调用构造。四、区别栈区 vs 堆区特性栈区 (Stack)堆区 (Heap)增长方向向下高地址→低地址向上低地址→高地址管理方式系统自动分配 / 释放程序员手动分配 / 释放空间大小小固定上限大动态扩展分配速度极快较慢内存碎片无有分配连续性连续内存不连续内存生命周期函数作用域内手动控制全程C/C 动态内存--核心区别对比项malloc / freenew / delete本质C 标准库函数C关键字 / 操作符类型安全返回void*必须强转返回目标类型指针无需强转内存初始化不初始化可直接初始化内存大小手动指定字节数自动计算失败处理返回NULL抛出异常类对象不调用构造 / 析构自动调用构造 / 析构数组无专用语法new[]/delete[]严格配对五、常见错误动态内存的 bug 是程序崩溃、内存泄漏的主要原因核心错误野指针指针指向已释放 / 非法内存未初始化、free后未置空、越界内存泄漏申请的内存未释放堆内存耗尽忘记free/delete、指针丢失重复释放多次free/delete同一个指针直接崩溃不匹配释放new[]用delete、new用delete[]类对象会漏调用析构混用函数malloc搭配delete、new搭配free未定义行为释放栈内存用free释放栈区指针非法操作越界访问申请 n 个元素访问 n1 位置破坏内存realloc后直接使用原指针扩容失败返回NULL原指针失效不判断分配结果直接使用NULL指针内存交叉释放释放不属于自己的堆内存。

相关文章:

C++动态内存/内存管理

文章目录 前言 一、内存分区 二、C 语言动态内存(标准库函数) 1.核心函数 2.代码示例 3.关键注意点 三、C 动态内存(关键字 / 操作符) 1.核心用法 (1)单个对象 (2)数组对象…...

LeetCodehot100-25 K 个一组翻转链表

class Solution { public:ListNode* reverseKGroup(ListNode* head, int k) {if (head nullptr || k 1) return head;ListNode dummy(0);dummy.next head;ListNode* prev &dummy; // 指向待反转组的前一个节点while (true) {// 检查剩余节点是否够k个ListNode* tail …...

模型航空喷气发动机CAD全套图纸(32张)

模型航空喷气发动机CAD学习资料是一套针对航空模型动力系统设计的系统性资源,涵盖从整体结构到局部零件的详细设计思路。32张图纸以标准化工程语言呈现,包含发动机外壳、燃烧室、涡轮组件、进气导管等核心模块的二维与三维视图,通过精确的线条…...

解锁RePKG的7个实战维度:从资源提取到合规创作的完整指南

解锁RePKG的7个实战维度:从资源提取到合规创作的完整指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 一、问题象限:资源处理的真实困境叙事 1.1 独立游…...

通过爱毕业AI的智能改写功能,五个方法助你快速降低论文重复率

嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...

STORM:基于检索与多视角提问的智能知识策展系统架构解析

STORM:基于检索与多视角提问的智能知识策展系统架构解析 【免费下载链接】storm An LLM-powered knowledge curation system that researches a topic and generates a full-length report with citations. 项目地址: https://gitcode.com/GitHub_Trending/sto/st…...

【LE Audio】PACS精讲[2]: 服务层核心逻辑,玩转音频能力发布与交互

在上一篇的内容里【LE Audio】PACS精讲[1]: 吃透基础规则,解锁音频能力发布核心逻辑,我们吃透了PACS的基础规则,从一致性要求、协议兼容、GATT交互约定到术语体系,搭建起了PACS的知识地基。而PACS的服务层,正是这些基础规则落地的核心载体,是蓝牙音频设备作为服务器对外发…...

SlopeCraft终极指南:如何轻松将任何图片转换为Minecraft立体地图画

SlopeCraft终极指南:如何轻松将任何图片转换为Minecraft立体地图画 【免费下载链接】SlopeCraft Map Pixel Art Generator for Minecraft 项目地址: https://gitcode.com/gh_mirrors/sl/SlopeCraft 你是否曾梦想将心爱的照片、动漫角色或艺术作品搬进Minecra…...

【苍穹外卖 | 篇⑥】登录流程

在牛某网看见了牛肉哥的帖子之后,打算向牛肉大佬学习,故开始书写CSDN博客,通过博客的方式来巩固自身知识学习。因为之前有粗略的学习了Java Web 的基础课程,所以博客内容主要是巩固之前学习当中的模糊点,以及一些自己认…...

个人时间管理神器:OpenClaw+百川2-13B自动分析日历与待办

个人时间管理神器:OpenClaw百川2-13B自动分析日历与待办 1. 为什么需要AI助手管理时间? 作为一个长期被多线程工作困扰的技术从业者,我一直在寻找能够真正理解时间管理需求的智能工具。传统的日历应用只能被动记录日程,而待办清…...

从清洗到展示:一份完整的微博评论LDA分析Jupyter Notebook实战笔记(附避坑点)

从清洗到展示:一份完整的微博评论LDA分析Jupyter Notebook实战笔记(附避坑点) 在数据爆炸的时代,社交媒体评论中蕴藏着大量有价值的用户观点。本文将带你用Jupyter Notebook完整走通微博评论的主题分析流程,从原始数据…...

指针的使用

指针基本用法C语言中使用指针可以1.程序简洁,紧凑,高效2.有效的表达复杂的数据结构3.动态分配内存4.得到多余一个的函数返回值5.编译或函数调用时为其分配内存单元6.变量是对程序中数据存储空间的抽象指针的感念在C语言中,内存单元的地址&…...

【stm32_2.1】【快速入门】自举模式、Flash闪存、LED点灯——对二极管PN结解析

目录 当前MCU概述 固化程序到单片机 自举模式 自举配置 Flash闪存 二极管的原理 当前MCU概述 MCU名称stm32F407ZET6处理器主频168MHz 闪存容量 512KB静态随机访问存储器SRAM192KBMCU引脚数量144pin 固化程序到单片机 写好的程序要固化到单片机,就必须学习怎…...

Vue3 + Cornerstone3D:从零构建支持本地Nifti文件上传与四视图联动的医学影像查看器

1. 为什么选择Vue3Cornerstone3D开发医学影像查看器 医学影像处理一直是前端开发中颇具挑战性的领域,特别是当需要处理专业格式如Nifti时。我在实际项目中尝试过多种技术方案后,发现Vue3和Cornerstone3D的组合特别适合快速构建高性能的医学影像应用。 …...

Vue与原生HTML页面无缝通信的iframe实现方案

1. 为什么需要Vue与原生HTML页面通信? 在实际开发中,我们经常会遇到这样的场景:一个Vue项目需要集成第三方提供的HTML页面,比如支付网关、地图服务、视频播放器等。这些页面通常都是独立开发的,使用原生HTML/JavaScrip…...

Dobby跨平台编译技术指南:从环境配置到多架构部署实践

Dobby跨平台编译技术指南:从环境配置到多架构部署实践 【免费下载链接】Dobby a lightweight, multi-platform, multi-architecture hook framework. 项目地址: https://gitcode.com/gh_mirrors/do/Dobby 一、基础认知:Hook框架与跨平台编译基础 …...

Unity 2023 + VS 2022 保姆级安装配置指南(含国内官网访问与许可证激活避坑)

Unity 2023 VS 2022 一站式开发环境配置实战手册 第一次打开Unity Hub时,那个旋转的立方体logo让我想起五年前自己踩过的坑——当时因为许可证激活失败,整整三天没能写出一行代码。这份手册将用我亲自验证过的方法,带您绕过所有常见陷阱&…...

奇偶判断算法的极端实现与优化

1. 奇偶判断算法的极端实现:从40亿条if语句到机器码优化1.1 项目背景与设计动机在计算机科学领域,判断数字奇偶性通常采用取模运算这一经典方法。然而,一个看似荒谬的想法引发了技术人员的深入思考:是否可以通过穷举所有可能的数字…...

告别重复劳动:OpenClaw+nanobot批量重命名与整理照片实战

告别重复劳动:OpenClawnanobot批量重命名与整理照片实战 1. 为什么需要自动化照片整理 每次旅行回来,面对相机和手机里混杂的几百张照片,整理工作总是让人头疼。手动创建文件夹、按日期地点分类、重命名文件——这些重复劳动不仅耗时&#…...

Spring AI 实战系列(二):ChatClient封装,告别大模型开发样板代码

系列栏目:Spring AI Spring AI 实战教程(一)入门示例 Spring AI 实战系列(二):ChatClient封装,告别大模型开发样板代码 Spring AI 实战系列(三)&…...

零基础玩转OpenClaw:Qwen3.5-9B镜像+可视化控制台体验

零基础玩转OpenClaw:Qwen3.5-9B镜像可视化控制台体验 1. 为什么选择OpenClawQwen3.5-9B组合 去年我在整理个人知识库时,每天要花2小时重复执行网页截图、OCR识别、内容归档的机械操作。直到发现OpenClaw这个能像人类一样操作电脑的开源智能体框架&…...

BleSerial:嵌入式BLE UART流式通信C++库

1. BleSerial 库概述BleSerial 是一个面向嵌入式系统的轻量级 C 库,其核心设计目标是将蓝牙低功耗(BLE)通信抽象为标准 CStream对象(即继承自Stream类的实例),从而无缝接入 Arduino 及兼容平台(…...

CGAL::Point_set_3 成员函数自查表

参考来源&#xff1a; CGAL 6.1.1 - 3D Point Set: CGAL::Point_set_3< Point, Vector > Class Template Reference 一、基础构造 / 容量 返回值函数名作用小 demoPoint_set_3()构造空点集Point_set ps;size_tnumber_of_points()获取点数auto n ps.number_of_points(…...

DownKyi:B站视频高效解决方案——如何三步搞定8K资源本地化管理

DownKyi&#xff1a;B站视频高效解决方案——如何三步搞定8K资源本地化管理 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印…...

[带AI]基于SpringBoot+Vue的青少年心理健康管理系统设计与实现+文档+指导搭建视频

&#xff5c;前后端分离&#xff5c;Java&#xff5c;SpringBoot&#xff5c;Vue3&#xff5c;Spring AI智能对话一、项目技术栈项目采用技术&#xff1a;① 架构模式&#xff1a;前后端分离开发② 系统环境&#xff1a;Windows、Mac③ 开发环境&#xff1a;IDEA、JDK21、MySQL…...

避坑指南:思科模拟器做链路聚合时,你可能会遇到的5个报错及解决方法

思科模拟器链路聚合实战&#xff1a;5个典型报错分析与精准排错指南 在Packet Tracer中配置链路聚合时&#xff0c;最令人头疼的往往不是基础配置步骤&#xff0c;而是那些突如其来的报错信息。上周有位学员在CCNA备考群里发了一张截图&#xff1a;%EC-5-CANNOT_BUNDLE2: Fa0/2…...

ssm+java2026年毕设唐山铂悦山养老院护理管理【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于养老院医护管理问题的研究&#xff0c;现有研究主要以医院信息管理系统&#xff08;HIS&#xff09;或综合性养老服务平台…...

STM32F103开发实录:当Clion的智能补全,遇上CubeMX+Keil5的稳定编译链

STM32F103开发实战&#xff1a;CLion智能编码与Keil5稳定编译的完美融合 第一次接触STM32开发时&#xff0c;我被Keil5那复古的界面和笨重的操作流程震惊了。作为一名习惯了现代IDE的开发者&#xff0c;我一直在寻找既能享受CLion智能编码体验&#xff0c;又能利用Keil5成熟编译…...

EspSoftwareSerial:ESP系列高性能软件串口实现

1. 项目概述EspSoftwareSerial是专为 ESP 系列微控制器&#xff08;ESP8266、ESP32、ESP32-S2、ESP32-S3、ESP32-C3&#xff09;设计的软件串口实现库&#xff0c;其核心目标是提供与 Arduino AVR 平台SoftwareSerial库高度兼容的 API 接口&#xff0c;同时充分利用 ESP 架构特…...

DDR5信号完整性解析:JESD79-5标准下的AC/DC输入测量关键指标

1. DDR5信号完整性的核心挑战 DDR5作为新一代内存标准&#xff0c;将数据传输速率推向了前所未有的高度。但随之而来的信号完整性问题&#xff0c;却让不少硬件工程师头疼不已。想象一下&#xff0c;当数据速率突破6400MT/s时&#xff0c;信号在传输线上就像是在走钢丝&#xf…...