C++11 智能指针学习

编程入门 行业动态 更新时间:2024-10-27 05:21:07

C++11 智能<a href=https://www.elefans.com/category/jswz/34/1768268.html style=指针学习"/>

C++11 智能指针学习

1. shared_ptr 学习

1.1 shared_ptr 定义方法

先定义空指针,再定义指向内容;

std::shared_ptr<int> p1 = std::make_shared<int>();*p1 = 78;

用在类中:

std::shared_ptr<class> p1 = std::make_shared<class>();*p1 = new class();

定义指针时新构建类

shared_ptr<class>p1=make_shared<class>(new class());

定义指针来指向旧指针指向的类

shared_ptr<A> pointer2 = pointer;

查看计数

pointer.use_count()

1.2 实验

#include <iostream>
#include  <memory> // 需要包含这个头文件using namespace std;
class A//定义一个类
{
public:int A_i = 0;A() {cout << "A" <<endl;}A(int i) {A_i = i;cout << "A" << i << endl;}~A() {cout << A_i<<"~A" << endl;}private:};
void test(shared_ptr<A> &pointer) {shared_ptr<A> pointer3 = pointer;cout << "test" << endl;cout << pointer.use_count() << endl;cout << "test end" << endl;
}
void test1(shared_ptr<A> pointer) {//是否引用有区别shared_ptr<A> pointer3 = pointer;cout << "test1" << endl;cout << pointer.use_count() << endl;cout << "test1 end" << endl;}
void test2() {shared_ptr<A> pointer4(new A(4));cout << pointer4.use_count() << endl;}int main()
{shared_ptr<A> pointer(new A());//定义智能指针cout << pointer.use_count() << endl;std::shared_ptr<A> pointer2 = pointer;cout << pointer.use_count() << endl;test(pointer);cout << pointer2.use_count() << endl;test1(pointer);cout << pointer2.use_count() << endl;std::shared_ptr<A> pointer5(new A(2));cout << pointer5.use_count() << endl;test2();cout << "test2 end" << endl;return 0;
}

2 unique_ptr

独占指针;

#include <iostream>
#include <memory>struct Task {int mId;Task(int id) :mId(id) {std::cout << "Task"<<mId<<"Constructor" << std::endl;}~Task() {std::cout << "Task" << mId << "::Destructor" << std::endl;}
};int main()
{// 空对象 unique_ptrstd::unique_ptr<int> ptr1;// 检查 ptr1 是否为空if (!ptr1)std::cout << "ptr1 is empty" << std::endl;// 检查 ptr1 是否为空if (ptr1 == nullptr)std::cout << "ptr1 is empty" << std::endl;// 不能通过赋值初始化unique_ptr// std::unique_ptr<Task> taskPtr2 = new Task(); // Compile Error// 通过原始指针创建 unique_ptrstd::unique_ptr<Task> taskPtr(new Task(1));// 检查 taskPtr 是否为空if (taskPtr != nullptr)std::cout << "taskPtr is  not empty" << std::endl;// 访问 unique_ptr关联指针的成员std::cout << taskPtr->mId << std::endl;std::cout << "Reset the taskPtr" << std::endl;// 重置 unique_ptr 为空,将删除关联的原始指针taskPtr.reset();// 检查是否为空 / 检查有没有关联的原始指针if (taskPtr == nullptr)std::cout << "taskPtr is  empty" << std::endl;// 通过原始指针创建 unique_ptrstd::unique_ptr<Task> taskPtr2(new Task(2));if (taskPtr2 != nullptr)std::cout << "taskPtr2 is  not empty" << std::endl;// unique_ptr 对象不能复制//taskPtr = taskPtr2; //compile error//std::unique_ptr<Task> taskPtr3 = taskPtr2;{// 转移所有权(把unique_ptr中的指针转移到另一个unique_ptr中)std::unique_ptr<Task> taskPtr4 = std::move(taskPtr2);// 转移后为空if (taskPtr2 == nullptr)std::cout << "taskPtr2 is  empty" << std::endl;// 转进来后非空if (taskPtr4 != nullptr)std::cout << "taskPtr4 is not empty" << std::endl;std::cout << taskPtr4->mId << std::endl;//taskPtr4 超出下面这个括号的作用于将delete其关联的指针}//大括号代表一个作用域;std::unique_ptr<Task> taskPtr5(new Task(3));if (taskPtr5 != nullptr)std::cout << "taskPtr5 is not empty" << std::endl;// 释放所有权Task * ptr = taskPtr5.release();if (taskPtr5 == nullptr)std::cout << "taskPtr5 is empty" << std::endl;std::cout << ptr->mId << std::endl;delete ptr;return 0;
}

3.weak_ptr

std::weak_ptr 用于观察 std::shared_ptr 所指向的对象,通过 weak_ptr 就可以得知对应的 shared_ptr 是否已经被销毁。

weak_prt简介

更多推荐

C++11 智能指针学习

本文发布于:2023-07-28 19:54:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1293540.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:指针   智能

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!