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

C++智能指针与内存管理实践

C智能指针与内存管理实践智能指针是C中自动管理动态内存的关键工具。通过RAII机制智能指针在对象生命周期结束时自动释放内存避免内存泄漏和悬空指针问题。std::unique_ptr提供独占所有权语义确保同一时刻只有一个指针拥有资源。它的开销极小几乎等同于原始指针。#include#include#includeclass Resource {int id_;std::vector data_;public:explicit Resource(int id) : id_(id), data_(1000, id) {std::cout Resource id_ created\n;}~Resource() {std::cout Resource id_ destroyed\n;}void process() {std::cout Processing resource id_ \n;}int id() const { return id_; }};void unique_ptr_basic() {std::unique_ptr ptr1(new Resource(1));ptr1-process();auto ptr2 std::make_unique(2);ptr2-process();std::unique_ptr ptr3 std::move(ptr2);if (!ptr2) {std::cout ptr2 is now null\n;}ptr3-process();}std::unique_ptr的自定义删除器允许管理非内存资源如文件句柄、网络连接等。struct FileDeleter {void operator()(FILE* fp) const {if (fp) {std::cout Closing file\n;fclose(fp);}}};void custom_deleter_example() {std::unique_ptr file(fopen(test.txt, w));if (file) {fprintf(file.get(), Hello from unique_ptr\n);}}templateclass UniquePtr {T* ptr_;void cleanup() {delete ptr_;ptr_ nullptr;}public:explicit UniquePtr(T* p nullptr) : ptr_(p) {}~UniquePtr() {cleanup();}UniquePtr(const UniquePtr) delete;UniquePtr operator(const UniquePtr) delete;UniquePtr(UniquePtr other) noexcept : ptr_(other.ptr_) {other.ptr_ nullptr;}UniquePtr operator(UniquePtr other) noexcept {if (this ! other) {cleanup();ptr_ other.ptr_;other.ptr_ nullptr;}return *this;}T* get() const { return ptr_; }T* release() {T* temp ptr_;ptr_ nullptr;return temp;}void reset(T* p nullptr) {cleanup();ptr_ p;}T operator*() const { return *ptr_; }T* operator-() const { return ptr_; }explicit operator bool() const { return ptr_ ! nullptr; }};std::shared_ptr实现引用计数允许多个指针共享同一资源。当最后一个shared_ptr被销毁时资源才会被释放。void shared_ptr_basic() {std::shared_ptr sp1 std::make_shared(10);std::cout Use count: sp1.use_count() \n;{std::shared_ptr sp2 sp1;std::cout Use count: sp1.use_count() \n;sp2-process();}std::cout Use count after scope: sp1.use_count() \n;}templateclass SharedPtr {T* ptr_;size_t* ref_count_;void release() {if (ref_count_) {--(*ref_count_);if (*ref_count_ 0) {delete ptr_;delete ref_count_;}}}public:explicit SharedPtr(T* p nullptr): ptr_(p), ref_count_(p ? new size_t(1) : nullptr) {}~SharedPtr() {release();}SharedPtr(const SharedPtr other): ptr_(other.ptr_), ref_count_(other.ref_count_) {if (ref_count_) {(*ref_count_);}}SharedPtr operator(const SharedPtr other) {if (this ! other) {release();ptr_ other.ptr_;ref_count_ other.ref_count_;if (ref_count_) {(*ref_count_);}}return *this;}SharedPtr(SharedPtr other) noexcept: ptr_(other.ptr_), ref_count_(other.ref_count_) {other.ptr_ nullptr;other.ref_count_ nullptr;}SharedPtr operator(SharedPtr other) noexcept {if (this ! other) {release();ptr_ other.ptr_;ref_count_ other.ref_count_;other.ptr_ nullptr;other.ref_count_ nullptr;}return *this;}T* get() const { return ptr_; }size_t use_count() const { return ref_count_ ? *ref_count_ : 0; }T operator*() const { return *ptr_; }T* operator-() const { return ptr_; }explicit operator bool() const { return ptr_ ! nullptr; }};std::weak_ptr用于打破循环引用它不增加引用计数但可以检测对象是否仍然存在。class Node {public:int value;std::shared_ptr next;std::weak_ptr prev;explicit Node(int v) : value(v) {std::cout Node value created\n;}~Node() {std::cout Node value destroyed\n;}};void weak_ptr_example() {auto node1 std::make_shared(1);auto node2 std::make_shared(2);node1-next node2;node2-prev node1;if (auto prev node2-prev.lock()) {std::cout Previous node value: prev-value \n;}}智能指针与容器结合使用时可以实现多态容器和资源管理。class Shape {public:virtual ~Shape() default;virtual void draw() const 0;virtual double area() const 0;};class Circle : public Shape {double radius_;public:explicit Circle(double r) : radius_(r) {}void draw() const override {std::cout Drawing circle with radius radius_ \n;}double area() const override {return 3.14159 * radius_ * radius_;}};class Rectangle : public Shape {double width_, height_;public:Rectangle(double w, double h) : width_(w), height_(h) {}void draw() const override {std::cout Drawing rectangle width_ x height_ \n;}double area() const override {return width_ * height_;}};void polymorphic_container() {std::vector shapes;shapes.push_back(std::make_unique(5.0));shapes.push_back(std::make_unique(4.0, 6.0));shapes.push_back(std::make_unique(3.0));double total_area 0;for (const auto shape : shapes) {shape-draw();total_area shape-area();}std::cout Total area: total_area \n;}make_shared相比直接使用shared_ptr构造函数更高效因为它只进行一次内存分配。templatestd::shared_ptr make_shared_impl(Args... args) {return std::shared_ptr(new T(std::forward(args)...));}void allocation_comparison() {auto sp1 std::shared_ptr(new Resource(1));auto sp2 std::make_shared(2);}智能指针的线程安全性需要特别注意。引用计数的修改是线程安全的但对象本身的访问不是。#include#includeclass ThreadSafeCounter {mutable std::mutex mutex_;int value_;public:ThreadSafeCounter() : value_(0) {}void increment() {std::lock_guard lock(mutex_);value_;}int get() const {std::lock_guard lock(mutex_);return value_;}};void thread_safety_example() {auto counter std::make_shared();std::vector threads;for (int i 0; i 10; i) {threads.emplace_back([counter]() {for (int j 0; j 1000; j) {counter-increment();}});}for (auto t : threads) {t.join();}std::cout Final count: counter-get() \n;}enable_shared_from_this允许对象从自身获取shared_ptr这在回调和异步操作中很有用。class AsyncOperation : public std::enable_shared_from_this {int id_;public:explicit AsyncOperation(int id) : id_(id) {}void start() {std::cout Starting operation id_ \n;auto self shared_from_this();std::thread([self]() {std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout Operation self-id_ completed\n;}).detach();}};void enable_shared_from_this_example() {auto op std::make_shared(1);op-start();std::this_thread::sleep_for(std::chrono::milliseconds(200));}智能指针的性能开销主要来自引用计数的原子操作。在性能关键路径上unique_ptr是更好的选择。#includevoid performance_comparison() {const int iterations 1000000;auto start std::chrono::high_resolution_clock::now();for (int i 0; i iterations; i) {auto ptr std::make_unique(i);volatile int value *ptr;}auto end std::chrono::high_resolution_clock::now();auto duration std::chrono::duration_cast(end - start);std::cout unique_ptr: duration.count() us\n;start std::chrono::high_resolution_clock::now();for (int i 0; i iterations; i) {auto ptr std::make_shared(i);volatile int value *ptr;}end std::chrono::high_resolution_clock::now();duration std::chrono::duration_cast(end - start);std::cout shared_ptr: duration.count() us\n;}智能指针与异常安全紧密相关确保即使在异常发生时资源也能正确释放。void exception_safety() {std::vector resources;try {resources.push_back(std::make_unique(1));resources.push_back(std::make_unique(2));throw std::runtime_error(Error occurred);resources.push_back(std::make_unique(3));} catch (const std::exception e) {std::cout Exception: e.what() \n;std::cout Resources automatically cleaned up\n;}}智能指针是现代C内存管理的基石。正确使用智能指针可以消除大部分内存管理问题使代码更加安全和易于维护。

相关文章:

C++智能指针与内存管理实践

C智能指针与内存管理实践智能指针是C中自动管理动态内存的关键工具。通过RAII机制,智能指针在对象生命周期结束时自动释放内存,避免内存泄漏和悬空指针问题。std::unique_ptr提供独占所有权语义,确保同一时刻只有一个指针拥有资源。它的开销极…...

华硕笔记本性能优化神器:G-Helper轻量控制工具完全指南

华硕笔记本性能优化神器:G-Helper轻量控制工具完全指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…...

如何快速掌握Blender 3MF插件:3个高效配置技巧实现CAD到3D打印无缝工作流

如何快速掌握Blender 3MF插件:3个高效配置技巧实现CAD到3D打印无缝工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否在为Blender与3D打印机之间的…...

【AI】多阶段执行:分阶段完成大型任务

多阶段执行:分阶段完成大型任务📝 本章学习目标:本章介绍流程编排,让AI Agent执行更加规范可控。通过本章学习,你将全面掌握"多阶段执行:分阶段完成大型任务"这一核心主题。一、引言:…...

深耕 Harness 工程,解锁 AI Agent 开发之路

2026三掌柜赠书活动第三十一期 Harness工程:从上下文管理到Agent系统构建 目录 前言 详解Harness工程核心价值与独特优势 关于《Harness工程:从上下文管理到Agent系统构建》 编辑推荐 内容简介 作者简介 图书目录 《Harness工程:从上…...

Parsec虚拟显示驱动实战教程:5步创建完美游戏串流显示环境

Parsec虚拟显示驱动实战教程:5步创建完美游戏串流显示环境 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd Parsec虚拟显示驱动(Parsec VDD)是一…...

AgentCore Memory的记忆哲学:让Agent学会“忘记”

大多数关于AI记忆的讨论都在谈“如何记住更多”。但问题不是记住,而是记住什么、忘记什么、以及当新旧信息冲突时该相信谁。假设用户第1天说“预算500美元”,第30天说“预算改成800了”,第60天用三种不同措辞说了“我喜欢Python”。没有整合能…...

哔哩下载姬DownKyi:新手也能快速上手的B站视频下载解决方案

哔哩下载姬DownKyi:新手也能快速上手的B站视频下载解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&…...

官方证书+创作基金等你拿|“AI绘童趣·童心创科普”庆六一活动正式启动!

为庆祝六一国际儿童节,守护青少年纯真的好奇心与想象力,百度文心大模型携手海豚出版社、天津人民出版社,共同推出“文心创作周六一特辑”,面向全国青少年及社会创作者发起“AI绘童趣童心创科普”青少年科普绘本创作活动。活动以ER…...

找工厂用什么工具?为什么“收录企业更多“是个伪指标

很多人在选工商数据工具的时候,被一个指标带着走——“收录企业数量更多”。直觉上,数据库越大越好,选谁不选大的。 但如果你的实际需求是"找工厂"——上游销售要找工厂客户、采购方要找代工供应商、跨境卖家要找一手代工厂——这个指标对你毫无意义,甚至是负担。原因…...

中国的“链主企业“到底是什么?上游销售员和采购方各应该怎么用它

如果你最近一两年在政策文件、地方政府工作报告、招商口径里反复看到"链主企业"“链长制”"产业链龙头"这一串词,你不是错觉——这是从工信部到国资委、从中央到省市,这两三年最常见的一组高频词。但它不是一个纯政策口号:对一线的上游销售员,"链主&q…...

从一家工厂的产品图、SKU 宽度和产品页,能读出哪些经营信息?一份给采购方和上游销售员的读图手册

采购、品牌方、上游销售员常遇到同一种困惑:打开一家"工厂"的店铺,产品图漂亮、SKU 铺得一大屏、参数行行写满,但聊几句发现对方根本不是工厂,是转单贸易商;或者是真工厂,但定位和需求完全错位。…...

Azure机器学习实战:汽车价格预测模型端到端部署

1. 项目概述:在 Azure 上构建一个真正能落地的汽车价格预测模型你有没有试过想买一辆二手车,却在几个平台之间反复比价、查配置、翻论坛,最后还是拿不准这台车到底值不值这个价?或者作为数据新人,手头有份汽车数据集&a…...

0522晨间日记

# 0522晨间日记 - 关键词 - 上午- 过站的问题- 昨天有一个产品卡在母子码绑定了- 早晨的各类菜单没有同步,不知道怎么做。- 最终明确是: 因为一个产品对应2种的条码导致的卡住了- 需要在条码规则上增加多个检查对应的- 总结- 最近一周西门子遇到的问题- …...

终极AMD Ryzen性能调优指南:SMUDebugTool完全掌握手册

终极AMD Ryzen性能调优指南:SMUDebugTool完全掌握手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...

Spring Boot Actuator生产级监控与管理工具包

Spring Boot Actuator 是 Spring Boot 提供的生产级监控与管理工具包,帮你把应用“可观测化”。它提供了一系列内置的端点(Endpoint),用来查看应用的内部状态,比如健康情况、配置信息、内存指标等。你可以把它理解成为…...

LangGraph 实战:如何实现 Human-in-the-Loop(人机协同)工作流

LangGraph实战:从零构建生产级Human-in-the-Loop人机协同工作流 副标题:含中断/人工审核/分支路由全场景实现,覆盖金融/法律/企业服务90%+通用场景 第一部分:引言与基础 1.1 摘要/引言 你有没有遇到过这些场景: 用大模型做合同自动审核,结果模型漏判了关键合规条款,直…...

3个高效窗口管理技巧:用AlwaysOnTop重新定义你的多任务工作流

3个高效窗口管理技巧:用AlwaysOnTop重新定义你的多任务工作流 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否曾在编写代码时,为了查看API文档而反…...

Mythos大模型:跨栈系统直觉与自主运维能力解析

1. 这不是一次普通升级:Mythos 的能力跃迁本质是什么?如果你过去三年持续关注大模型演进,大概率会记得2023年Claude 2发布时那种“稳扎稳打”的观感——推理更连贯、长文本更可靠、越狱难度更高,但没人会说它“颠覆了什么”。2024…...

MoE大模型核心揭秘:Router路由机制与活跃参数原理

1. 这不是“参数越多越强”的简单故事:拆解大模型里那个被悄悄藏起来的“开关”你肯定见过这类标题:“GPT-4参数量达1.8万亿!”、“DeepSeek-R1狂堆6710亿参数!”——光看数字,像在比谁家粮仓更大。但真正干过模型部署…...

魔兽争霸3终极优化指南:5个简单步骤让经典游戏在现代系统上完美运行

魔兽争霸3终极优化指南:5个简单步骤让经典游戏在现代系统上完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Win…...

5分钟搞定百度网盘限速:baidu-wangpan-parse全功能指南

5分钟搞定百度网盘限速:baidu-wangpan-parse全功能指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的限速而烦恼吗?想下载大文件却只…...

3分钟解锁:让魔兽争霸3在现代Windows系统上完美运行的完整指南

3分钟解锁:让魔兽争霸3在现代Windows系统上完美运行的完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代Wind…...

AI双轨制实战指南:MoE架构、异构模态与弹性推理的工程落地

1. 这不是新闻简报,而是一份AI地缘技术格局的实操观察手记你点开这篇文字,大概率不是为了读一篇“本周AI大事件汇总”。如果你真需要那种信息,直接刷Twitter或Hugging Face的Weekly Digest就够了。我写这个,是因为过去三个月里&am…...

瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题

文章目录环境症状问题原因解决方案环境 系统平台:UOS(海光) 版本:9.0 症状 瀚高数据库版本:企业版 V9.1.1 症状: pg_restore还原备份文件时,提示下面错误 pg_restore: 来自 TOC 记录 259; …...

Borderless Gaming终极指南:如何彻底告别Alt+Tab卡顿的游戏窗口无缝切换方案

Borderless Gaming终极指南:如何彻底告别AltTab卡顿的游戏窗口无缝切换方案 【免费下载链接】Borderless-Gaming Play your favorite games in a borderless window; no more time consuming alt-tabs. 项目地址: https://gitcode.com/gh_mirrors/bo/Borderless-…...

生成式AI技术债:五大高发区与系统级防御实战

1. 项目概述:当生成式AI跑得比工程实践快时,技术债就不是“欠着”,而是“滚着”我带过三支不同行业的AI落地团队,从金融风控到智能客服再到工业质检,最近两年最常听到的不是“模型效果怎么样”,而是“这周又…...

边缘AI闭环数控系统:基于IIoT的轻量级CNC智能改造实践

1. 项目概述:这不是在改装一台机床,而是在给金属切削装上“神经系统”“AI-Driven Machining: Building a Closed-Loop CNC System with IIoT Feedback (Building the CNC)”——这个标题里没有一个词是虚的。它不是讲怎么用AI生成G代码,也不…...

AI驱动的CNC闭环控制系统:边缘实时感知与控制实践

1. 项目概述:这不是在改装一台机床,而是在给金属加工装上“神经系统”“AI-Driven Machining: Building a Closed-Loop CNC System with IIoT Feedback (Building the CNC)”——这个标题里没有一个词是虚的。它不是在讲怎么用AI生成个加工路径图&#x…...

Scarab终极教程:2024年最完整的空洞骑士模组管理器使用指南

Scarab终极教程:2024年最完整的空洞骑士模组管理器使用指南 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装而烦恼吗?Scarab模…...