C++智能指针

C++智能指针

智能指针是一种封装了原始指针的类,它们通过自动管理内存的分配和释放来减少内存泄漏和其他相关错误。

std::unique_ptr

std::unique_ptr 是一个模板类,提供了对单一对象的独占所有权语义。这意味着,任何时候只能有一个 unique_ptr 指向特定对象。它的主要特点和用法包括:

  • 独占所有权 :一旦 unique_ptr 指向一个对象,没有其他的 unique_ptr 可以指向同一个对象。

  • 自动销毁 :当 unique_ptr 离开其作用域或被显式销毁时,它所指向的对象也会被删除。

  • 转移所有权 :您可以通过 std::move 转移 unique_ptr 的所有权。

  • 用法

    c 复制代码
    std::unique_ptr<int> ptr(new int(10)); // 创建 unique_ptr
    std::unique_ptr<int> ptr2 = std::move(ptr); // 转移所有权

std::shared_ptr

std::shared_ptr 是另一种智能指针,它实现了共享所有权的概念。多个 shared_ptr 可以指向同一个对象,对象只有在最后一个指向它的 shared_ptr 被销毁时才会被删除。

  • 引用计数shared_ptr 使用内部引用计数机制来跟踪有多少个 shared_ptr 实例指向同一个资源。

  • 线程安全:引用计数的增加和减少是线程安全的(但指针指向的对象的操作不一定是线程安全的)。

  • 用法

    c 复制代码
    std::shared_ptr<int> sharedPtr1(new int(10));
    std::shared_ptr<int> sharedPtr2 = sharedPtr1; // 两个 shared_ptr 共享同一个资源

std::weak_ptr

std::weak_ptr 是一种不拥有对象的智能指针,它设计用来观察但不延长 shared_ptr 所管理的对象的生命周期。

  • 打破循环引用 :在 shared_ptr 之间可能形成的循环引用中,weak_ptr 可用来作为一个非拥有的观察者。

  • weak_ptr 创建 shared_ptr :可以从 weak_ptr 安全地创建 shared_ptr,这在访问资源时是有用的。

  • 用法

    c 复制代码
    std::weak_ptr<int> weakPtr(sharedPtr1); // 从 shared_ptr 创建 weak_ptr
    if (auto tempPtr = weakPtr.lock()) { // 安全地获取 shared_ptr
        // 使用 tempPtr
    }

实践建议

  • 内存管理:智能指针自动管理内存,这有助于避免内存泄漏。
  • 所有权和生命周期:明确对象的所有权和生命周期是使用智能指针的关键。
  • 避免裸指针:优先使用智能指针而不是裸指针。
  • 资源释放:智能指针在销毁时自动释放资源,但要注意在循环或长期持有大量资源时可能导致的内存问题。

智能指针的使用提高了 C++ 程序的安全性和健壮性,是现代 C++ 编程实践的一个重要组成部分。

相关推荐
小徐不徐说11 分钟前
VS 2022 Visual Assist 破解
c++·visualstudio·工具·插件
2601_9638699536 分钟前
【计算机毕业设计】基于Java的潮牌购物网站系统的设计与实现
java·开发语言·课程设计
名字还没想好☜1 小时前
Go 的 io.Reader/Writer 组合实战:io.Copy、TeeReader、MultiWriter 优雅处理数据流
开发语言·后端·golang·go·iphone
郝学胜-神的一滴1 小时前
Qt 高级编程 042:进度条从入门到自定义美化
开发语言·c++·qt·软件开发·用户界面
啦啦啦啦啦zzzz1 小时前
5种IO模型
运维·服务器·网络·c++
鸿芯微控科技1 小时前
压电纳米定位分辨率怎么测?噪声、带宽、最小可检测位移与Python分析
开发语言·python·噪声分析·压电执行器·纳米定位·位移测量
会编程的土豆1 小时前
从「锁」到「时间」:后端里几个容易混的概念
java·开发语言·数据库·goland
呱呱巨基2 小时前
Docker 基础概念学习
linux·c++·学习·docker
@小匠2 小时前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端
Knight_AL2 小时前
Lombok @Builder 踩坑:build() 前后对象类型不一样
android·java·开发语言