Bootstrap

C++左值引用与右值引用区别

  • 左值与右值是具体的值,引用是引用具体的值
  • C++的值语义
    • 还带GC的语言中,变量大都是引用语义,内存管理是交由机器来管理的
    • 而C++可以通过值引用非常方便变量的生命周期,也就是可以通过RAII来管理资源
      • RAII:resource Acquisition Is Initialization,资源获取即初始化。它是一种编程技术,主要用于管理资源(如内存、文件句柄、网络连接等)的生命周期,确保资源在使用完毕后能够被正确释放,从而避免资源泄漏。
        • 资源的获取与对象的初始化绑定:在对象的构造函数中获取资源(如分配内存、打开文件等)
        • 资源的释放与对象的销毁绑定:在对象的析构函数中释放资源(如释放内存、关闭文件等)
      • 通过这种方式,RAII 确保了资源的生命周期与对象的生命周期一致,从而避免了手动管理资源的复杂性和潜在错误
      • 给不需要显式调用资源释放代码
      • RAII典型应用场景:
        1. 内存管理:使用智能指针(std::unique_prtstd::shared_ptr
        2. 文件管理:使用文件流对象(std::ifstreamstd::ofstream
        3. 锁管理:使用锁对象(std::lock_guardstd::unique_lock
      • RAII实现原理:依赖对象的构造函数和析构函数的自动调用机制
#include <iostream>

class ManagedArray {
public:
    ManagedArray(size_t size) : size_(size), data_(new int[size]) {
        std::cout << "Array allocated of size " << size_ << std::endl;
    }

    ~ManagedArray() {
        delete[] data_;
        std::cout << "Array deallocated" << std::endl;
    }

    int& operator[](size_t index) {
        return data_[index];
    }

private:
    size_t size_;
    int* data_;
};

int main() {
    {
        ManagedArray arr(10); // 数组分配
        arr[0] = 42; // 使用数组
    } // arr 超出作用域,数组自动释放
    return 0;
}
{
    std::unique_ptr<int> ptr(new int(10)); // 内存分配
    // 使用 ptr
} // ptr 超出作用域,内存自动释放

{
    std::ofstream file("example.txt"); // 打开文件
    file << "Hello, RAII!"; // 写入文件
} // 文件自动关闭

std::mutex mtx;
{
    std::lock_guard<std::mutex> lock(mtx); // 加锁
    // 临界区代码
} // 自动解锁
  • 代码理解:
    • 在C++中的的STL是使用容器对象来管理数据,也使用函数对象来管理C语言中的函数指针
    • 总之是使用对象概念来管理资源
  • 引用:引用是别名,也就是对具体资源引用的一个别名,引用必须在声明时就要初始化,目的就是引用对象来修改它
;