IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++11 智能指针学习 -> 正文阅读

[C++知识库]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_ptr
	std::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_ptr
	std::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_ptr
	std::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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:10:02  更:2022-03-08 22:10:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:38:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码