侯捷 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

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

相关推荐
知识分享小能手6 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
汇能感知8 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun8 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao9 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾9 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
利刃大大9 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
DKPT10 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa10 小时前
HTML和CSS学习
前端·css·学习·html
ST.J10 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
C语言小火车10 小时前
【C++八股文】基础知识篇
c++·tcp/ip·const·智能指针·多线程同步·static关键字·c++内存模型