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

c++ #include <memory> 智能指针介绍

#include <memory> 是 C++ 标准库中的头文件,用于支持智能指针的功能。智能指针是现代 C++ 的一种资源管理工具,用于自动管理动态分配的内存,从而减少内存泄漏和悬挂指针等问题的发生。它提供了多种类型的智能指针,包括 std::unique_ptrstd::shared_ptr 和 std::weak_ptr

1. #include <memory>

  • #include:预处理指令,用于在编译时包含指定的头文件。
  • <memory>:包含智能指针类的定义和相关功能。

2. 智能指针类型

  • std::unique_ptr

    • 功能:表示对某个动态分配对象的唯一所有权。它不能被复制,只能被移动。
    • 使用场景:用于独占资源的场景,例如需要确保只有一个对象拥有资源。
    • 示例
#include <memory>

int main() {
    std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
    // std::unique_ptr<int> ptr2 = ptr1; // 错误:unique_ptr 不能被复制
    std::unique_ptr<int> ptr2 = std::move(ptr1); // 转移所有权
    return 0;
}

std::shared_ptr

  • 功能:表示对某个动态分配对象的共享所有权。多个 shared_ptr 可以指向同一个对象,直到最后一个 shared_ptr 被销毁时,资源才会被释放。
  • 使用场景:用于多个对象需要共享对同一资源的所有权的场景。
  • 示例
#include <memory>
#include <iostream>

int main() {
    std::shared_ptr<int> ptr1 = std::make_shared<int>(20);
    std::shared_ptr<int> ptr2 = ptr1; // 共享所有权
    std::cout << *ptr1 << ", " << *ptr2 << std::endl; // 输出:20, 20
    return 0;
}

std::weak_ptr

  • 功能:与 std::shared_ptr 配合使用,用于解决共享所有权中的循环引用问题。weak_ptr 不会影响对象的引用计数,因此不会阻止对象的销毁。
  • 使用场景:用于观察对象而不影响其生命周期。
  • 示例
#include <memory>
#include <iostream>

class Node {
public:
    std::shared_ptr<Node> next;
};

int main() {
    std::shared_ptr<Node> first = std::make_shared<Node>();
    std::weak_ptr<Node> weakFirst = first; // 创建 weak_ptr 观察 first
    if (auto sharedFirst = weakFirst.lock()) {
        std::cout << "Node is still alive" << std::endl;
    } else {
        std::cout << "Node has been destroyed" << std::endl;
    }
    return 0;
}

3.使用示例

#include <iostream>
#include <memory>

int main() {
    // 使用 unique_ptr
    std::unique_ptr<int> uniquePtr = std::make_unique<int>(100);
    std::cout << "UniquePtr value: " << *uniquePtr << std::endl;

    // 使用 shared_ptr
    std::shared_ptr<int> sharedPtr1 = std::make_shared<int>(200);
    std::shared_ptr<int> sharedPtr2 = sharedPtr1;
    std::cout << "SharedPtr value: " << *sharedPtr1 << ", " << *sharedPtr2 << std::endl;

    // 使用 weak_ptr
    std::weak_ptr<int> weakPtr = sharedPtr1;
    if (auto lockedPtr = weakPtr.lock()) {
        std::cout << "WeakPtr value: " << *lockedPtr << std::endl;
    } else {
        std::cout << "WeakPtr is expired" << std::endl;
    }

    return 0;
}

4. 优点

  • 自动管理内存:智能指针自动管理动态内存,减少了内存泄漏和手动释放内存的需要。
  • 安全性:智能指针避免了许多常见的内存管理错误,如悬挂指针和双重释放。
  • 简洁性:提供了高效、易用的内存管理接口,使得代码更易于编写和维护。

使用 #include <memory> 可以有效地帮助管理动态内存,提升 C++ 程序的安全性和稳定性。

相关文章:

  • linux-系统管理与监控-日志管理
  • 企业项目中响应工具类
  • Python编程 - 线程
  • ARM/Linux嵌入式面经(三四):CVTE
  • [数据集][目标检测]岩石种类检测数据集VOC+YOLO格式4766张9类别
  • 怎么使用ai 免费生成ppt?这4个工具可以帮忙
  • C++速通LeetCode简单第20题-多数元素
  • Java基础-反射
  • MySQL之安装与基础知识
  • 【贪心算法】贪心算法
  • 自动化抢票 12306
  • STL-vector练习题
  • python Open3D 验证安装崩溃
  • 认识原码反码补码
  • C# 入坑JAVA 潜规则 大小写敏感文件名和类名 枚举等 入门系列2
  • Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享
  • Vite + Electron 时,Electron 渲染空白,静态资源加载错误等问题解决
  • 华为SMU02B1智能通信电源监控单元模块简介
  • LabVIEW机械手视觉引导系统
  • RedisTemplate操作ZSet的API
  • 俄副外长:俄美两国将举行双边谈判
  • 广东省中医院脾胃病科大科主任张北平病逝,年仅52岁
  • 安徽省委副秘书长、省委政研室主任余三元调任省社科院院长
  • 三亚通报救护车省外拉警报器开道旅游:违规违法,责令公司停业整顿
  • 沈阳卫健委通报“健康证”办理乱象:涉事医院已被立案查处
  • 专访|导演刘江:给谍战题材注入现实主义的魂