推荐B站文章:
6.shared_ptr与unique_ptr_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p=6&vd_source=a934d7fc6f47698a29dac90a922ba5a3我的往期文章:
独占指针:unique_ptr 与 函数调用-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135841140?spm=1001.2014.3001.5501计数指针:shared_ptr (共享指针)与函数-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135851596?spm=1001.2014.3001.5501
(1)shared_ptr 与 unique_ptr
- 不能将shared_ptr 转换为unique_ptr
- unique_ptr可以转换为shared_ptr
- 通过std::move
(2)常见的设计
- 将你的函数返回unique_ptr是一种常见的设计模式,这样可以提高代码的复用度,你可以随时改变为shared_ptr
- 因为返回unique_ptr类型的可以直接赋值给shared_ptr 类型的
#include <iostream>
#include <memory>
#include "cat.h"
using namespace std;
std::unique_ptr<Cat> get_unique_ptr() {
std::unique_ptr<Cat> cat_p = std::make_unique<Cat>("lanmao");
return cat_p;
}
int main(int argc,char* argv[]) {
std::unique_ptr<Cat> c_p_1 = std::make_unique<Cat>("TomCat");
std::shared_ptr<Cat> c_p_2 = std::move(c_p_1);// 将unique_ptr转换成shared_ptr
cout<<"c_p_2 use count : " << c_p_2.use_count() << endl;// 1
// func
std::shared_ptr<Cat> c_p_3 = get_unique_ptr();
if(c_p_3) {
c_p_3->catInfo();
cout<<"c_p_3 use count : " << c_p_3.use_count() << endl; // 输出1
}
cout<<"over~"<<endl;
return 0;
}
执行结果:
PS D:\Work\C++UserLesson\cppenv\bin\Debug> ."D:/Work/C++UserLesson/cppenv/bin/Debug/app.exe"
Constructor of Cat : TomCat
c_p_2 use count : 1
Constructor of Cat : lanmao
cat info name : lanmao
c_p_3 use count : 1
over~
Destructor of Cat
Destructor of Cat
PS D:\Work\C++UserLesson\cppenv\bin\Debug>