讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么实现一个简单的垃圾回收机制_C++智能指针与引用计数GC

风丽同学_5923

风丽同学_5923

发布时间:2025-11-24 14:07:02

|

279人浏览过

|

来源于php中文网

原创

C++中可通过智能指针模拟自动内存管理,std::shared_ptr基于引用计数实现对象生命周期管理,避免内存泄漏;循环引用问题可用std::weak_ptr解决;自定义SimplePtr可演示原理,但实际推荐使用标准库智能指针。

c++怎么实现一个简单的垃圾回收机制_c++智能指针与引用计数gc

在C++中,虽然没有像Java或C#那样的自动垃圾回收机制(GC),但我们可以通过智能指针和引用计数的方式模拟一个简单的自动内存管理机制。这种方式能有效避免内存泄漏,提升代码的安全性和可维护性。

智能指_ptr与引用计数的基本原理

引用计数是一种常见的资源管理技术:每当有一个对象指针指向某块内存时,该内存的引用计数加1;当指针被销毁或指向其他对象时,引用计数减1;当引用计数变为0时,说明没有指针再使用这块内存,可以安全释放。

C++标准库中的 std::shared_ptr 就是基于引用计数实现的智能指针。它自动管理动态分配的对象生命周期,无需手动调用 delete。

示例代码:

立即学习“C++免费学习笔记(深入)”;

#include <memory><br>#include <iostream><br><br>struct MyClass {<br>    MyClass() { std::cout << "MyClass 构造\n"; }<br>    ~MyClass() { std::cout << "MyClass 析构\n"; }<br>};<br><br>int main() {<br>    {<br>        std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();<br>        {<br>            std::shared_ptr<MyClass> ptr2 = ptr1; // 引用计数 +1<br>            std::cout << "当前引用计数: " << ptr1.use_count() << "\n"; // 输出 2<br>        } // ptr2 离开作用域,引用计数 -1<br>        std::cout << "ptr2 销毁后引用计数: " << ptr1.use_count() << "\n"; // 输出 1<br>    } // ptr1 销毁,引用计数为0,自动析构对象<br>    return 0;<br>}

如何避免循环引用问题

引用计数最大的问题是循环引用:两个或多个对象互相持有 shared_ptr,导致引用计数永远不为0,内存无法释放。

解决方法是使用 std::weak_ptr,它是一个弱引用指针,不会增加引用计数,仅用于临时访问 shared_ptr 管理的对象。

Rydberg Agent Node
Rydberg Agent Node

使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r

下载

示例:用 weak_ptr 打破循环

#include <memory><br><br>struct Node {<br>    std::shared_ptr<Node> parent;<br>    std::weak_ptr<Node> child; // 使用 weak_ptr 避免循环<br><br>    ~Node() { std::cout << "Node 被销毁\n"; }<br>};<br><br>int main() {<br>    auto node1 = std::make_shared<Node>();<br>    auto node2 = std::make_shared<Node>();<br><br>    node1->child = node2;<br>    node2->parent = node1; // parent 是 shared_ptr,但 child 是 weak_ptr<br><br>    // 当 main 结束时,两个节点都能正确释放<br>    return 0;<br>}

自定义简单GC思路(教学用途)

如果你想从零实现一个极简的引用计数GC,可以封装一个带计数器的结构体,手动管理增减计数。

以下是一个简化版示例:

template<typename T><br>class SimplePtr {<br>private:<br>    T* ptr;<br>    int* count;<br><br>public:<br>    explicit SimplePtr(T* p) : ptr(p), count(new int(1)) {}<br><br>    SimplePtr(const SimplePtr& other) : ptr(other.ptr), count(other.count) {<br>        (*count)++;<br>    }<br><br>    SimplePtr& operator=(const SimplePtr& other) {<br>        if (this != &other) {<br>            release();<br>            ptr = other.ptr;<br>            count = other.count;<br>            (*count)++;<br>        }<br>        return *this;<br>    }<br><br>    void release() {<br>        (*count)--;<br>        if (*count == 0) {<br>            delete ptr;<br>            delete count;<br>        }<br>    }<br><br>    ~SimplePtr() { release(); }<br><br>    T& operator*() { return *ptr; }<br>    T* operator->() { return ptr; }<br>};

这个简易指针展示了引用计数的核心逻辑:构造、拷贝、赋值、析构时正确操作计数器。

基本上就这些。实际开发中推荐直接使用 std::shared_ptr 和 std::weak_ptr,它们经过充分测试且线程安全。自己实现GC容易出错,除非有特殊需求,否则没必要重复造轮子。理解其原理更重要。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4394

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4551

2025.07.04

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

339

2026.04.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3918

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2771

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

845

2023.12.29

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

PixPix官网入口合集
PixPix官网入口合集

本专题汇总了PixPix官网在线使用入口及平台功能详解,涵盖文生图、图生图、AI图片编辑、AI视频创作等核心能力,并整理了AI爆款图片复刻、商品套图、详情页生成、视频变清晰与去水印等电商专项工具的使用教程。同时收录了PixPix MCP接入Codex、Claude Code等主流Agent的操作指南,助您一站式完成AI图片与视频创作。

0

2026.10.09

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

60

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn