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

【C++八股】智能指针

智能指针⽤于管理动态内存的对象,其主要⽬的是在避免内存泄漏和多次释放资源。

1. std::unique_ptr 独占智能指针

std::unique_ptr 是一种独立智能指针,独占内存资源,不能被其他独立智能指针共享,拥有自动释放内存的功能。

std::unique_ptr 拥有对某个对象的控制权。当 std::unique_ptr 被销毁时,它所管理的对象也会被自动销毁,从而有效防止内存泄漏。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructed\n"; }
    ~MyClass() { std::cout << "MyClass destructed\n"; }
    void doSomething() { std::cout << "Doing something\n"; }
};

int main() {
    // 创建 std::unique_ptr
    std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();

    // 使用 -> 访问成员
    ptr1->doSomething();

    // 无法复制 std::unique_ptr
    // std::unique_ptr<MyClass> ptr2 = ptr1; // 编译错误

    // 可以移动 std::unique_ptr
    std::unique_ptr<MyClass> ptr2 = std::move(ptr1);

    // ptr1 现在为空
    if (ptr1 == nullptr) {
        std::cout << "ptr1 is null\n";
    }

    // ptr2 现在拥有对象
    ptr2->doSomething();

    // 离开作用域时,ptr2 自动删除对象
}

2.std::shared_ptr (共享智能指针)

shared_ptr 旨在管理动态分配对象的生命周期,支持多个指针共享同一对象的所有权。它通过引用计数机制来追踪有多少个 std::shared_ptr 实例指向同一个对象,当引用计数降为零时,自动释放所管理的对象,从而有效防止内存泄漏。

主要特性:

  • 共享所有权: 多个 std::shared_ptr 实例可以指向同一个对象,共享对该对象的所有权。每次拷贝或赋值都会增加引用计数,每次析构都会减少引用计数。当引用计数为零时,自动删除所指向的对象。

  • 线程安全: std::shared_ptr 的引用计数是线程安全的,可以在多个线程中安全地拷贝和销毁。但需要注意,对同一对象的操作仍需使用适当的同步机制。

  • 内存管理: std::shared_ptr 内部维护一个控制块,包含引用计数和删除器等信息。使用 std::make_shared 创建 std::shared_ptr 时,会同时分配对象和控制块的内存,避免了多次内存分配,提高了性能。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructed\n"; }
    ~MyClass() { std::cout << "MyClass destructed\n"; }
    void doSomething() { std::cout << "Doing something\n"; }
};

int main() {
    // 使用 std::make_shared 创建 std::shared_ptr
    auto ptr1 = std::make_shared<MyClass>();

    // 使用 -> 访问成员
    ptr1->doSomething();

    // 拷贝构造,引用计数增加
    auto ptr2 = ptr1;
    std::cout << "Reference count: " << ptr1.use_count() << "\n"; // 输出 2

    // 赋值构造,引用计数增加
    auto ptr3 = ptr2;
    std::cout << "Reference count: " << ptr1.use_count() << "\n"; // 输出 3

    // 离开作用域时,ptr1、ptr2 和 ptr3 会被销毁,引用计数减少
    // 当引用计数为 0 时,自动释放 MyClass 对象
}

相关文章:

  • 372_C++_当有多个通道,开启不同告警的同一种的开关时,限制该开关的打开数量(比如视频上传开关)
  • Spring Boot 中的事务管理:默认配置、失效场景及集中配置
  • 北斗导航 | 基于多假设解分离(MHSS)模型的双星故障监测算法(MATLAB代码实现——ARAIM)
  • 【prompt示例】智能客服+智能质检业务模版
  • vue组件中各种类型之间的传值
  • Spring Boot 配置 Mybatis 读写分离
  • mapbox进阶,添加绘图扩展插件,绘制任意方向矩形
  • 【LLM】13:大模型算法面试题库
  • Python客户端和C服务器之间的连接问题及其解决方案
  • 在 Windows 系统中如何快速进入安全模式的两种方法
  • Django中select_related 的作用
  • 51单片机看门狗系统
  • 读取本地excel删除第一行,并生成List数组
  • 贪心算法与动态规划的区别
  • GPT-4o微调SFT及强化学习DPO数据集构建
  • 装饰器模式 + 责任链模式:动态增强的流水线处理艺术
  • Modbus TCP协议
  • 【第2章:神经网络基础与实现——2.1 前馈神经网络的结构与工作原理】
  • 亚远景-ASPICE 4.0 与 AI 驱动的汽车软件开发:未来趋势与挑战
  • 力扣第一题 哈希解法 O(n)时间复杂度
  • 上海145家博物馆、73家美术馆将减免费开放
  • 联合国秘书长欢迎中美经贸高层会谈成果
  • 北洋“修约外交”的台前幕后——民国条约研究会档案探研
  • 广东韶关一镇干部冲进交通事故火海救人,获授“见义勇为”奖励万元
  • 菲律宾举行中期选举
  • “海豚音”依旧,玛丽亚·凯莉本周来沪开唱