微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
共享智能指针std::shared_ptr
独占智能指针std::unique_ptr
弱智能指针std::weak_ptr
使用时候需要引入头文件。
共享智能指针
// make_shared初始化
int a = 1;
std::shared_ptr<int> a1 = std::make_shared<int>(a);
std::cout << "a1: "<<*a1 << std::endl;
// 直接初始化
std::shared_ptr<int> a2 = std::shared_ptr<int>(new int(2));
std::cout << "a2: " << *a2 << std::endl;
// 一个原始指针,只能初始化一个智能指针
int* ptr = new int(12);
std::shared_ptr<int> a3(ptr);
// std::shared_ptra4(ptr); //直接挂了!
// 从智能指针中获取原始指针
int* pp = a3.get();
std::cout << "pp: " << *pp << std::endl;
独占智能指针与弱智能指针
共享智能指针的代码演示
typedef struct person {
std::string name;
int age;
};
std::vector<person> persons;
person p3;
p3.name = "opencv4";
p3.age = 20;
person p4;
p4.name = "opencv5";
p4.age = 21;
persons.emplace_back(p3);
persons.emplace_back(p4);
for (auto item : persons) { // 修改的是副本
item.age = 24;
}
for (auto item : persons) {
std::cout << "item.age: " << item.age << std::endl;
}
for (auto &item : persons) { // 获取引用地址
item.age = 24;
}
for (auto item : persons) {
std::cout << "item.age: " << item.age << std::endl;
}
改用智能指针
std::vector<std::shared_ptr<person>> pps;
person x;
auto p5 = std::make_shared<person>(x);
p5->name = "make_shared";
auto p1 = std::shared_ptr<person>(new person());
auto p2 = std::shared_ptr<person>(new person());
p1->age = 12;
p1->name = "qing";
p2->age = 32;
p2->name = "zhigang";
pps.emplace_back(p1);
pps.emplace_back(p2);
pps.emplace_back(p5);
for (auto item : pps) {
item->age = 24;
}
for (auto item : pps) {
std::cout << "item->name: " << item->name << " item->age:" << item->age << std::endl;
}
运行结果如下:
最后,推荐使用make_shared来初始化共享智能指针!抛砖引玉,欢迎各位高手继续补充,我负责精选留言~~~~~
推荐阅读
CV全栈开发者说 - 从传统算法到深度学习怎么修炼
Pytorch轻松实现经典视觉任务
教程推荐 | Pytorch框架CV开发-从入门到实战
OpenCV4 C++学习 必备基础语法知识三
OpenCV4 C++学习 必备基础语法知识二
YOLOv5发布第六个版本,支持一键适配OpenVINO/OpenCV DNN部署