参考: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具有赋值拷贝的语义。
-
用法:
-
作为需要保存在容器里的对象,同时避免频繁创建引起性能上的开销
如果一个类的创建需要比较多的资源(例如比较大的的内存和拷贝),如果我们直接保存在容器里可能会在拷贝时产生比较大的性能损失,这个时候可以考虑使用
shared_ptr
,然后将shared_ptr
保存于容器。vector> foos; // ... for(auto &foo : foos){ process_func(*foo); }
COPY -
定制删除器
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代理的循环引用无法析构的问题