【C++11】智能指针底层原理

1. 简介

C++11 引入的智能指针(Smart Pointers)是管理动态内存的工具,旨在自动释放不再使用的对象,防止内存泄漏。它们通过 RAII(资源获取即初始化)技术封装原始指针,在对象生命周期结束时自动释放内存。C++11 提供了三种主要的智能指针:

2. RAII 思想

概述

说明一下:智能指针是类对象,它们封装了原始指针,并提供了一种机制来自动管理和释放所指向的对象。

  • 那么这种机制是什么? 就是我们接下来要介绍的RAII思想。
    RAII(资源获取即初始化):使用局部对象来管理资源的技术(局部对象自动销毁的特性来控制对象的生命周期)。局部对象是存储在栈上的对象,它的生命周期是由操作系统完成的,无需人工接入。
代码理解
  • 让我们举一个例子来深入理解一下什么是RAII
  • 假如我们想要对文件进行操作
// 1. 没用使用 RAII 操作来管理资源
void manualFileHandling(const char* filename) {
   
    // 手动打开文件(获取资源)
    std::ofstream file(filename);
    if (file.is_open()) {
   
        file << "Hello, World!" << std::endl;
        // 假设这里发生异常或提前返回
        if (/* 某些条件 */) return;
        // 必须手动关闭文件(释放资源)
        file.close();
    }
} // 如果提前返回,文件不会被正确关闭
// ----------------------------------------------------------------
// 2. 使用 RAII 操作来管理资源
class FileManager{
   
private:
    std::ofstream file; // 封装文件资源
public:
    explicit FileManager(const char* filename) : file(filename) {
   }
    ~FileManager() {
   
        if (file.is_open()) {
   
            // 在 FileManage 对象析构的时候自动调用析构函数来关闭文件
            file.close(); 
            std::cout << "File closed by RAII" << std::endl;
        }
    }
    void write(const char* text) {
   
        if (file.is_open()) {
   
            file << text << std::endl;
        }
    }
};

void raiiFileHandling(const char* filename) {
   
    // 创建RAII包装器(获取资源)
    std::unique_ptr<FileManager> manager 
    	= std::make_unique<FileManager>(filename);
    manager->write("Hello, RAII!");
    

你可能感兴趣的:(c++)