智能指针shared_ptr/unique_ptr

参考:C++ 三种智能指针的使用场景(unique_ptr vs shared_ptr vs weak_ptr) - 零壹生万物

智能指针的语义是拥有(own)一个对象的所有权,并且控制其生存期。

智能指针可以对内存资源进行很好的管理,避免内存泄漏或者内存访问错误的发生。

unique_ptr

  • unique_ptr 没有拷贝语义(unique_ptr),不可以通过拷贝赋值和构造,但是可以通过移动语义进行资源所有权的转移。

  • unique_ptr的使用场景,最常见的就是拥有一个一个对象的所有权,就像传统C指针的最基础用法,保存一个申请于堆上的对象

  • 构造,使用工厂函数 make_unique,更加简洁

    auto q = std::make_unique(1);//better

shared_ptr

  • shared_ptr 内部有引用计数,在对象所有权需要共享的时候(share)用,shared_ptr具有赋值拷贝的语义。

  • 用法:

    1. 作为需要保存在容器里的对象,同时避免频繁创建引起性能上的开销

      如果一个类的创建需要比较多的资源(例如比较大的的内存和拷贝),如果我们直接保存在容器里可能会在拷贝时产生比较大的性能损失,这个时候可以考虑使用shared_ptr,然后将shared_ptr保存于容器。

      vector> foos;
      // ...
      for(auto &foo : foos){
       process_func(*foo);
      }COPY
    2. 定制删除器

      shared_ptr 支持在构造的时候传入一个定制删除器,替代delete在生命周期结束时调用。可以以此实现RAII的思想。

      // tranditionally 
      FILE *fp = fopen("./1.txt","r");
      // ...
      // ...
      fclose(fp);
      //-------
      // 通过使用定制删除器, 将删除器作为回调函数传入
      shared_ptr fp1(fopen("./1.txt","r"),fclose);COPY

      例如上面这个例子,在fp1生命周期结束的时候,将会调用fclose(fp)而不是delete(fp)。 这个例子参考 C++智能指针:shared_ptr用法详解_Tonson_的博客-CSDN博客

weak_ptr

  • weak_ptr 的语义是并不真正own一个对象的所有权,而是需要在使用的时候检查一下指针的有效性,可以应用于可能失效的场景,例如缓存、观察者模式的订阅者等等。也应用于打破shared_ptr代理的循环引用无法析构的问题

猜你喜欢

转载自blog.csdn.net/luyumiao1990/article/details/131760037