上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

从0开始学C++ 第二十五课:C++中的资源管理与智能指针

guduadmin281月前

第二十五课:C++中的资源管理与智能指针

学习目标:

  • 理解动态内存管理的原理与实践。
  • 掌握智能指针的概念、用途及其在动态内存管理中的应用。

    学习内容:

    1. 动态内存管理基础:

      • C++程序在运行时分配的内存主要分为两种:自动存储(如局部变量)和动态存储(使用动态内存分配)。
      • 使用new操作符可以在堆上分配内存,它返回指向新分配类型的指针。使用delete操作符释放由new分配的内存。
        int* ptr = new int;    // 分配单个整数
        *ptr = 5;              // 给分配的整数赋值
        delete ptr;            // 释放内存
        ptr = nullptr;         // 将ptr设置为nullptr,防止悬空指针
        
        • 对于数组的动态分配,使用带有方括号的new和delete。
          int* array = new int[10];   // 分配10个整数的数组
          delete[] array;              // 释放整个数组
          
          • 动态内存管理的问题:
            • 内存泄漏:忘记释放内存导致程序占用越来越多的内存。
            • 悬空指针:释放内存后继续使用原来的指针。
            • 双重删除:对同一个内存地址调用两次delete。
            • 智能指针简介:

              • 智能指针是一种对象,它像常规指针一样使用,但会在适当的时候自动释放它所管理的资源。这些指针是模板类,定义在头文件中。
              • std::unique_ptr:

                • std::unique_ptr提供了独占的内存所有权模型。一旦std::unique_ptr对象被销毁,它所指向的对象也会被自动销毁。
                • std::unique_ptr不支持拷贝和赋值,确保同一时间只有一个unique_ptr指向特定资源。
                • 通常使用std::make_unique函数创建std::unique_ptr实例。
                  std::unique_ptr uptr = std::make_unique(10); // 使用make_unique
                  
                • std::shared_ptr:

                  • std::shared_ptr使用引用计数机制来确保多个指针可以共享同一资源的所有权。
                  • 当最后一个shared_ptr被销毁时,资源会被自动释放。
                  • 通常使用std::make_shared函数创建std::shared_ptr实例。
                    std::shared_ptr sptr = std::make_shared(20); // 使用make_shared
                    
                  • std::weak_ptr:

                    • std::weak_ptr设计用来解决std::shared_ptr可能导致的循环引用问题。
                    • std::weak_ptr不控制对象的生命周期,在需要时通过调用lock方法尝试获取std::shared_ptr来访问资源。
                      std::weak_ptr wptr = sptr; // sptr是一个shared_ptr
                      if (std::shared_ptr sptr_locked = wptr.lock()) {
                          // 使用sptr_locked访问资源
                      } else {
                          // 资源已经被释放
                      }
                      

    练习题:

    编写一个程序,创建一个std::shared_ptr管理的int数组。使用std::shared_ptr和std::weak_ptr演示资源共享和弱引用的概念。

    #include 
    #include 
    int main() {
        // 创建一个shared_ptr管理的int数组
        std::shared_ptr sptr(new int[3]{1, 2, 3}, std::default_delete());
        // 创建一个weak_ptr指向同一个数组
        std::weak_ptr wptr(sptr);
        // 使用lock()尝试获取一个shared_ptr
        if (auto shared = wptr.lock()) {
            for (int i = 0; i < 3; ++i) {
                std::cout << shared[i] << ' ';
            }
            std::cout << '\n';
        } else {
            std::cout << "资源已释放。\n";
        }
        // shared_ptr离开作用域,数组被自动释放
        return 0;
    }
    // 预计输出效果
    // 1 2 3
    

    答案解析:

    本练习中,我们首先创建了一个由std::shared_ptr管理的整数数组。然后,我们创建了一个std::weak_ptr,指向相同的数组。通过lock方法尝试获取std::shared_ptr,如果资源仍然存在,我们输出数组的内容。当最后一个std::shared_ptr被销毁时,数组资源也会被自动释放。

    目录

    第二十六课:理解C++中的Lambda表达式

网友评论

搜索
最新文章
热门文章
热门标签
 
 女人梦见狗咬手有牙印没出血  梦见上香是什么预兆  梦见螃蟹成群往身上爬