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++知识库 -> 一、BOOST库学习之智能指针 -> 正文阅读

[C++知识库]一、BOOST库学习之智能指针

前言

本次笔记记录如下知识点

  1. 智能指针的原理
  2. unique_ptr的原理及作用
  3. shared_ptr的原理及作用
  4. weak_ptr的原理及作用

一、智能指针的原理

  • 智能指针的产生:在C++中程序员为了提高程序的效率,对堆内存管理会非常的频繁,为了不造成堆内存泄露,所以使用智能指针可以更好的管理堆内存。
  • 智能指针的原理:智能指针是一个类,这个类中会在构造函数中传入一个普通的指针,在析构中释放这个指针。智能指针的类是栈上的对象,智能指针指向堆上开辟的空间,函数结束时,栈上的函数会自动被释放,智能指针指向的内存也会随之消失,防止内存泄漏。

二、unique_ptr的原理及作用

1、unique_ptr的作用

  • unique_ptr唯一拥有其所指向的对象,同一时刻,unique_ptr独占所指对象。不能拷贝构造和拷贝赋值,支持转移语义。

2、unique_ptr的实现原理

  • unique_ptr本质上是一个类,只是可以像一个指针一样使用,首先释放指针内存这个操作我们可以在析构函数中进行delete的操作,之后可以在类中把拷贝构造函数和拷贝赋值声明为private,这样就不可以对指针指向进行拷贝了,从而实现了独占的方式。

代码实现示例如下

template <class T,class D = default_delete<T>>
class unique_ptr {
public:
	//保存传入的指针
	typedef some_define  pointer;
	typedef T			 element_type;
	//构造函数
	concept		unique_ptr() noexcept;
	explicit	unique_ptr(pointer p) noexcept;
	//析构函数
	~unique_ptr();
	//转移语义赋值
	unique_ptr& operator=(unique_ptr&& u) noexcept;
	//获取原始指针
	pointer     get() const noexcept;
	//释放指针的管理权
	pointer     release() noexcept;
	//禁止拷贝
	unique_ptr(const unique_ptr&)				=	delete;
	unique_ptr&	operator=(const unique_ptr&)	=	delete;
};

3、unique_ptr中的使用

代码示例如下

#include <vector>

class Example
{
public:
	Example(int param = 0)
	{
		number = param;
		cout << "Example: " << number << endl;
	}

	~Example() { cout << "~Example: " << number << endl; }

	void test_print() { cout << "in test print: number = " << number << endl; }

	void set_number(int num) { number = num; }

private:
	int number;
};


int main()
{
	//1、测试unique_ptr中的各种函数
	unique_ptr<Example> ptr(new Example(1));
	ptr.get()->test_print();			//获取指针打印结果
	ptr->set_number(10);				//设置值
	ptr.get()->test_print();			//获取指针打印结果
	Example* p  =  ptr.release();		//释放对象
	ptr.reset(p);						//重置对象
	ptr.get()->test_print();			//获取指针打印结果
	ptr.reset();
	if (ptr)							//调用operator bool 检测内部对象的有效性
	{
		cout << "ptr1 is valid\n";
	}
	cout << "-------------------------------------\n";
	//2、测试unique_ptr作为容器元素
	vector<unique_ptr<Example>> v(7);
	for (int i = 0; i < 7; i++)
	{
		v[i] = unique_ptr<Example>(new Example(50 + i));
	}
	//直接赋值
	v[6]->test_print();
	v[6] = unique_ptr<Example>(new Example(46));
	v[6]->test_print();
	//直接将unique_ptr对象push_back
	v.push_back(unique_ptr<Example>(new Example(66)));
	v[7]->test_print();
	//利用make_unique创建unique_ptr
	v.push_back(make_unique<Example>(77));
	v[8]->test_print();
	return 0;
}

运行结果如下
在这里插入图片描述

三、shared_ptr的原理及作用

1、unique_ptr的作用

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:01:53  更:2021-07-27 16:02:16 
 
开发: 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年5日历 -2024/5/1 21:13:40-

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