C/C++动态内存管理,智能指针及RAlI思想。
一、C 语言动态内存管理malloc/calloc/realloc/free四个核心函数都在cstdlib操作原始堆内存只分配 / 释放内存不会调用构造、析构函数。1、void* malloc(size_t size)分配 size 字节未初始化堆内存分配失败返回 NULL。int* arr (int*)malloc(sizeof(int) * 10);2、void* calloc(size_t num, size_t size)分配 num 个、每个 size 字节分配后内存全部置 0。3、void* realloc(void* ptr, size_t new_size)扩容 / 缩容已有内存ptr 为 NULL等价 mallocnew_size0等价 free原内存数据会拷贝到新空间旧内存自动释放。4、void free(void* ptr)释放堆内存只能释放 malloc/calloc/realloc 分配的内存free 空指针安全重复 free、free 栈变量 / 全局变量 → 未定义行为崩溃。二、C 原生动态内存 new /delete1. 基础用法// 单个对象 int* p new int(10); delete p; // 对象数组 int* arr new int[5]{1,2,3,4,5}; delete[] arr; // 数组必须带[]否则只调用第一个元素析构内存错乱2. new 底层两步operator new底层调用 malloc 开辟堆内存调用构造函数初始化对象。3. delete 底层两步调用对象析构函数释放对象内部资源operator delete调用 free 归还堆内存。4. new/delete 相比 malloc/free 的优势自动调用构造、析构适配 C 类、自定义对象自带类型安全无需强制类型转换支持数组语法区分单个对象与数组释放。5. new/delete 存在大量问题忘记 delete → 内存泄漏同一块内存多次 delete / 栈指针 delete → 程序崩溃函数中途抛异常、提前 returndelete 执行不到多函数传递裸指针内存所有权模糊没人负责释放异常安全差new 成功后如果后续代码抛异常delete 不会执行。根本解决方案RAII 智能指针三、RAII 核心思想Resource Acquisition Is Initialization 资源获取即初始化1. 核心定义把资源获取写在类的构造函数资源释放写在类的析构函数利用栈对象自动生命周期栈上局部对象离开作用域正常 return、break、抛出异常时编译器一定会自动调用析构函数保证资源释放。四、C 标准智能指针memory全部基于 RAII 实现智能指针本质是封装裸指针的栈对象依靠 RAII 自动释放堆内存彻底替代手动 delete。分三类unique_ptr、shared_ptr、weak_ptr1. std::unique_ptr 独占智能指针最常用特性独占所有权一块内存只能被一个 unique_ptr 持有禁止拷贝构造 / 拷贝赋值只支持移动语义std::move无引用计数运行时开销几乎和裸指针一致性能最优代码示例// 推荐一步分配内存异常安全 auto up std::make_uniqueint(666); // auto up2 up; // 编译报错禁止拷贝 auto up2 std::move(up); // 所有权转移up变为空 // 离开作用域自动释放内存适用场景资源只需要单一管理者绝大多数堆内存场景优先 unique_ptr。.最常用成员函数get()获取裸指针reset()释放 / 更换资源release()交出裸指针自身置空2. std::shared_ptr 共享智能指针特性共享所有权内部维护原子引用计数器支持拷贝拷贝时引用计数 1智能指针销毁 / 覆盖赋值时计数 - 1引用计数变为 0 时自动释放堆内存性能损耗原子操作多线程同步开销高于 unique_ptr致命缺陷循环引用会导致内存泄漏。代码示例auto sp1 std::make_sharedstd::string(test); auto sp2 sp1; // 计数1两个指针共用一块内存.最常用成员函数get()获取裸指针reset()释放 / 更换资源use_count()获取当前引用计数循环引用泄漏场景面试高频两个类互相持有对方 shared_ptr引用计数永远不为 0内存无法释放struct A { std::shared_ptrB b; }; struct B { std::shared_ptrA a; }; void leakDemo() { auto a std::make_sharedA(); auto b std::make_sharedB(); a-b b; b-a a; // 函数结束a、b销毁但互相持有计数内存泄漏 }3. std::weak_ptr 弱智能指针配套 shared_ptr 解决循环引用特性不增加引用计数不拥有内存所有权仅做 “观察者”只能由 shared_ptr 构造使用前调用.lock()升级为 shared_ptr判断内存是否存活.expired()。改造上面循环引用解决泄漏struct A { std::shared_ptrB b; }; struct B { std::weak_ptrA a; // 改用weak_ptr不增加计数 };常用成员函数lock()升级成 shared_ptr用来访问对象expired()判断对象是否已经销毁reset()清空弱指针use_count()查看强引用数量4. make_unique /make_shared 为什么比 new 好内存分配一步到位make_shared 把控制块 对象内存分配在同一块连续堆减少内存碎片缓存友好异常安全若func(std::shared_ptrT(new T), func_throw())编译器可能先执行 new T 分配内存再执行抛异常函数内存分配成功但无智能指针接管直接泄漏make 系列将分配和构造绑定不会出现裸内存悬空。

相关新闻

排序算法稳定性与原地性:从冒泡到堆排的5个关键特性速查表

排序算法稳定性与原地性:从冒泡到堆排的5个关键特性速查表

排序算法稳定性与原地性:从冒泡到堆排的5个关键特性速查表1. 排序算法核心特性解析排序算法是计算机科学中最基础也最重要的算法类别之一。在实际开发、面试和考试(如计算机考研408)中,深入理解各种排序算法的特性至关重要。我们通…

2026/7/12 4:17:39阅读更多 →
ChatGPT自动生成README的终极边界:当LLM遇到monorepo依赖图谱、跨语言SDK引用与FIPS合规声明时,如何不越界?

ChatGPT自动生成README的终极边界:当LLM遇到monorepo依赖图谱、跨语言SDK引用与FIPS合规声明时,如何不越界?

更多请点击: https://intelliparadigm.com 第一章:ChatGPT自动生成README的终极边界:当LLM遇到monorepo依赖图谱、跨语言SDK引用与FIPS合规声明时,如何不越界? 大型语言模型在生成项目文档时,常将README视…

2026/7/12 4:17:39阅读更多 →
多维聚合实战:从Pandas切片到ClickHouse物化视图

多维聚合实战:从Pandas切片到ClickHouse物化视图

1. 项目概述:当数据聚合从“加总”走向“空间折叠”你有没有遇到过这样的场景:销售报表里,区域经理要按“省份→城市→门店”三级下钻看毛利,财务总监却需要把同一份数据按“产品线→季度→销售渠道”重新切片分析,而风…

2026/7/12 4:17:39阅读更多 →
Godot开发效率提升指南:Awesome-Godot资源库实战应用与避坑

Godot开发效率提升指南:Awesome-Godot资源库实战应用与避坑

1. 项目概述:为什么你需要Awesome-Godot?如果你正在用Godot引擎做游戏,或者刚刚对它产生兴趣,那你大概率听说过“Awesome-Godot”这个名字。它不是一个具体的游戏项目,而是一个在GitHub上由社区维护的、汇集了海量Godo…

2026/7/12 5:22:43阅读更多 →
Unity C#脚本性能优化实战:从Profiler诊断到GC优化

Unity C#脚本性能优化实战:从Profiler诊断到GC优化

1. 项目概述:当Coze-Loop遇上Unity,脚本优化不再是玄学最近在折腾一个叫“Coze-Loop”的游戏原型,这名字听起来有点新潮,本质上它是一个强调循环机制和状态流转的游戏框架。在Unity里实现这类逻辑,C#脚本就成了绝对的核…

2026/7/12 5:22:43阅读更多 →
Unity xLua项目内存泄漏检测与排查实战指南

Unity xLua项目内存泄漏检测与排查实战指南

1. 项目概述:为什么Unity Lua项目需要终极内存泄漏检测?在Unity项目里引入Lua热更新,尤其是使用xLua这样的成熟框架,几乎是现在中大型手游项目的标配。它能让你在不发版的情况下修复线上Bug、更新活动逻辑,灵活性拉满。…

2026/7/12 5:22:43阅读更多 →
SVN密码加密实战:htpasswd命令详解与安全配置指南

SVN密码加密实战:htpasswd命令详解与安全配置指南

1. 项目概述:为什么SVN密码需要加密?在团队协作开发中,版本控制系统是基石。SVN(Subversion)作为一款经典的集中式版本控制系统,至今仍在许多企业,尤其是传统软件项目、游戏开发或特定内部系统中…

2026/7/12 5:22:43阅读更多 →
UE5多人游戏Enhanced Input实战:输入隔离、上下文堆叠与网络处理

UE5多人游戏Enhanced Input实战:输入隔离、上下文堆叠与网络处理

1. 项目概述:当多人游戏遇上Enhanced Input最近在折腾一个UE5的多人对战项目,输入处理这块儿真是让我掉了一地的头发。项目初期,我们几个老伙计一拍脑袋,决定全面拥抱UE5的Enhanced Input系统,毕竟官方文档和社区都在力…

2026/7/12 5:22:43阅读更多 →
长视频转文字:Python实现稳定高准度ASR工程方案

长视频转文字:Python实现稳定高准度ASR工程方案

1. 项目概述:为什么“从长视频里抽文字”这件事,比你想象中更难也更重要 “Extract the text from long videos with Python”——这个标题乍看平平无奇,像极了某次课后作业或Stack Overflow上的小提问。但在我过去十年做音视频内容处理、教育…

2026/7/12 5:17:43阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/11 23:15:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/11 18:12:23阅读更多 →