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

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

相关文章:

  • 【Transformer模型学习】第三篇:位置编码
  • NLP10-TF-IDF文本向量化
  • java+jvm笔记
  • 如何使用C#与SQL Server数据库进行交互
  • hutool Java的工具箱介绍
  • Tomcat 是什么?有什么功能和作用?为什么启动 Spring 或 Spring Boot 项目需要 Tomcat?
  • Redis的持久化-RDBAOF
  • 大白话React第九章React 前沿技术与企业级应用实战
  • Python本地下载文件的教程
  • Linux服务器部署Deepseek、Dify、RAGflow实战教程
  • 代码的解读——自用
  • Spring Boot 异步编程
  • 大语言模型学习--LangChain
  • 6. 自动关闭文件
  • 知识图谱neo4j+vue+flask课程在线学习系统
  • 怎么下载安装yarn
  • Hive-05之查询 分组、排序、case when、 什么情况下Hive可以避免进行MapReduce
  • 【计算机网络基础】-------计算机网络概念
  • postgresql源码学习(60)—— VFD的作用及机制
  • 大模型function calling:让AI函数调用更智能、更高效
  • 哪些企业需要做网站建设/怎样在网上推广
  • 做cpa项目用什么网站/百度健康人工客服电话24小时
  • 安徽网站建/泰州百度seo公司
  • 网站策划方案 优帮云/百度推广代运营
  • 广西造建设工程协会网站/网络营销技巧培训
  • 网站制作售后/注册域名费用一般多少钱