侯捷 C++ 课程学习笔记:深入理解智能指针

文章目录

每日一句正能量

如果说幸福是一个悖论,那么,这个悖论的解决正存在于争取幸福的过程之中。其实有斗争,有苦恼,但是要希望尚存,就有幸福。

一、引言

侯捷老师的 C++ 系列课程一直是我学习 C++ 的重要指导。在众多知识点中,智能指针这一部分让我印象深刻。它不仅解决了传统指针的诸多痛点,还体现了现代 C++ 的设计理念。通过深入学习,我对智能指针有了更深刻的理解,并在实际项目中尝试应用,收获颇丰。

二、智能指针的核心概念

智能指针是现代 C++ 中用于自动管理动态分配内存的一种工具。它通过封装原始指针,利用 RAII(资源获取即初始化)机制,在对象生命周期结束时自动释放内存,从而避免了内存泄漏和悬空指针等问题。侯捷老师在课程中详细讲解了智能指针的几种类型,包括 std::unique_ptrstd::shared_ptrstd::weak_ptr,并强调了它们的使用场景和注意事项。

(一)std::unique_ptr

std::unique_ptr 是一种独占所有权的智能指针,它确保同一时间只有一个指针指向一块动态分配的内存。它的实现基于模板,支持自定义删除器,能够很好地管理动态分配的资源。侯捷老师通过代码示例展示了 std::unique_ptr 的使用方法,让我深刻理解了它的独占性和自动释放机制。

例如,在一个简单的场景中,我们可以通过 std::unique_ptr 管理动态分配的对象:

cpp 复制代码
#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "Object created\n"; }
    ~MyClass() { std::cout << "Object destroyed\n"; }
};

int main() {
    std::unique_ptr<MyClass> ptr(new MyClass());
    // 当 ptr 超出作用域时,自动调用析构函数释放资源
}

(二)std::shared_ptr

std::shared_ptr 是一种共享所有权的智能指针,允许多个指针指向同一块内存。它通过引用计数机制来管理资源的生命周期,当最后一个 std::shared_ptr 被销毁时,才会释放资源。侯捷老师特别强调了引用计数的开销以及循环引用问题,并通过实际案例展示了如何使用 std::weak_ptr 解决循环引用。

例如,在一个对象图中,两个对象相互引用时,很容易出现循环引用问题。通过 std::weak_ptr,我们可以打破这种循环引用:

cpp 复制代码
#include <memory>
#include <iostream>

class B;

class A {
public:
    std::shared_ptr<B> bPtr;
    ~A() { std::cout << "A destroyed\n"; }
};

class B {
public:
    std::weak_ptr<A> aPtr; // 使用 weak_ptr 避免循环引用
    ~B() { std::cout << "B destroyed\n"; }
};

int main() {
    std::shared_ptr<A> aptr = std::make_shared<A>();
    std::shared_ptr<B> bptr = std::make_shared<B>();

    aptr->bPtr = bptr;
    bptr->aPtr = aptr; // 使用 weak_ptr 指向 A
}

(三)std::weak_ptr

std::weak_ptr 是一种弱引用指针,它不增加引用计数,但可以观察被 std::shared_ptr 管理的对象。它的主要用途是解决循环引用问题,同时也可以用于延迟加载等场景。侯捷老师通过对比 std::shared_ptrstd::weak_ptr 的使用场景,让我明白了它们的互补关系。

三、学习心得

通过学习侯捷老师的课程,我对智能指针有了更深入的理解。智能指针不仅是一种内存管理工具,更是一种现代 C++ 的设计理念。它让我们能够更安全、更高效地管理动态资源,减少内存泄漏和悬空指针等问题。

在学习过程中,我意识到智能指针的使用需要根据具体场景选择合适的类型。例如,当资源需要独占时,应使用 std::unique_ptr;当需要共享资源时,应使用 std::shared_ptr,并注意避免循环引用。此外,引用计数的开销也是需要考虑的因素之一。

侯捷老师强调的"少用裸指针"原则也让我受益匪浅。在现代 C++ 中,智能指针几乎可以替代所有裸指针的使用场景,这不仅提高了代码的安全性,还减少了内存管理的复杂性。通过实践,我逐渐养成了使用智能指针的习惯,这让我在编写 C++ 程序时更加得心应手。

四、实际应用案例

在实际项目中,我尝试将智能指针应用于一个简单的图形渲染引擎中。在这个项目中,我们需要管理大量的动态分配的图形对象,如纹理、模型和场景节点。使用智能指针可以确保这些对象在生命周期结束时自动释放资源,避免内存泄漏。

例如,我们定义了一个 Texture 类和一个 Model 类,它们都通过智能指针进行管理:

cpp 复制代码
#include <memory>
#include <vector>
#include <iostream>

class Texture {
public:
    Texture() { std::cout << "Texture created\n"; }
    ~Texture() { std::cout << "Texture destroyed\n"; }
};

class Model {
public:
    Model() { std::cout << "Model created\n"; }
    ~Model() { std::cout << "Model destroyed\n"; }
    std::shared_ptr<Texture> texture;
};

int main() {
    std::shared_ptr<Model> model = std::make_shared<Model>();
    model->texture = std::make_shared<Texture>();

    // 当 model 超出作用域时,自动释放 Model 和 Texture 的资源
}

在这个案例中,std::shared_ptr 确保了 ModelTexture 的生命周期管理。当 model 超出作用域时,ModelTexture 的资源会被自动释放,避免了手动管理内存的复杂性和风险。

此外,我还尝试使用 std::weak_ptr 来管理场景图中的节点关系。通过弱引用,我们可以避免循环引用问题,同时确保节点的生命周期管理更加灵活。

五、总结

通过学习侯捷老师的 C++ 课程,我对智能指针有了更深刻的理解。智能指针不仅是现代 C++ 的重要特性,更是内存管理的有力工具。它通过 RAII 机制,解决了传统指针的诸多问题,让内存管理变得更加安全和高效。

在实际项目中,智能指针的应用也让我体会到了现代 C++ 的强大和便捷。通过合理使用 std::unique_ptrstd::shared_ptrstd::weak_ptr,我们可以更好地管理动态资源,减少内存泄漏和悬空指针等问题。侯捷老师的课程不仅让我掌握了知识,更让我学会了如何在实际项目中应用这些知识。

未来,我将继续深入学习侯捷老师的课程,探索更多现代 C++ 的特性和应用场景,不断提升自己的编程能力。


:本文内容仅为个人学习笔记,如有错误或不足之处,欢迎指正。

转载自:https://blog.csdn.net/u014727709/article/details/146026240

欢迎 👍点赞✍评论⭐收藏,欢迎指正

相关推荐
Miqiuha14 分钟前
gmock和cppfreemock原理学习
学习
老胖闲聊14 分钟前
Python Flask框架学习汇编
汇编·python·学习·flask
虾球xz17 分钟前
游戏引擎学习第133天
java·学习·游戏引擎
试试看16817 分钟前
汇编前置知识学习 第11-13天
汇编·学习·进制
Halsey Walker18 分钟前
QT实现简约美观的动画Checkbox
c++·qt·动画
haoly198919 分钟前
集合论--形式化语言里的汇编码
学习
小呀小萝卜儿25 分钟前
2025-03-04 学习记录--C/C++-C语言 判断是否是素数
c语言·学习
炬火初现30 分钟前
仿mudou库one thread oneloop式并发服务器
服务器·c++·muduo
乄北城以北乀36 分钟前
muduo库源码分析:TcpConnection 类
linux·数据结构·c++·后端·网络协议·tcp/ip·visual studio
wen__xvn2 小时前
每日一题蓝桥杯P8598 [蓝桥杯 2013 省 AB] 错误票据c++
开发语言·数据结构·c++·算法