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

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语言中的函数指针
    • 总之是使用对象概念来管理资源
  • 引用:引用是别名,也就是对具体资源引用的一个别名,引用必须在声明时就要初始化,目的就是引用对象来修改它

http://www.kler.cn/a/568898.html

相关文章:

  • fps项目总结:关于攻击与受击
  • Java中Stream流的详细使用介绍
  • Hive-04之存储格式、SerDe、企业级调优
  • 从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略
  • Modular Prompt Learning Improves_Vision-Language Models
  • Linux三种网络方式
  • 上位机知识篇---HTTPHTTPS等各种通信协议
  • 基于Springboot博物馆文博资源库系统【附源码】
  • Armbian: 轻量级 ARM 设备专用 Linux 发行版全面解析
  • 人工智能之数学基础:矩阵的范数
  • 单道与多道系统:操作系统进化的关键跃迁
  • python中单例模式介绍(含线程安全的单例模式)
  • vue 项目部署到nginx 服务器
  • Web安全中的二次注入攻击
  • KubeSphere部署Elastisearch
  • Linux下线程的同步与互斥
  • 深入浅出:从零开始掌握 Autofac 的依赖注入技巧
  • Java 8 到 Java 17 主要新特性
  • 《OpenCV》—— dlib库
  • Windows 上通过 VScode 配置 Docker