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++智能指针 -> 正文阅读

[C++知识库]C++智能指针

????????简单介绍c++11的四种智能指针的用法。使用智能指针需要包含头文件#include<memory>。c++11提出了四种智能指针auto_ptr,unique_ptr,shared_ptr和weak_ptr。

1.auto_ptr:

????????auto_ptr是使用raii机制设计的智能指针,它在构造时申请动态内存,析构时释放动态内存。

使用方法如下:

#include<memory>
#include<iostream>

int main() {
	std::auto_ptr<int32_t> p(new int32_t(10));	//创建时指定动态对象
	std::auto_ptr<int32_t> q;	//创建空智能指针
	q.reset(new int32_t(9));	//绑定对象
	std::cout << *p;
	std::cout << *q.get();	//q.get()得到普通指针int32_t*
	
	return 0;
}

????????但是由于浅拷贝的原因,当我们拷贝智能指针后,程序出现了两个指向相同对象的智能指针,此时如果程序退出那么一定会有一个智能指针在释放内存时内存已释放完毕,产生错误。

????????出于上面原因可以说几乎所有程序都不要使用auto_ptr。

2.unique_ptr:

? ? ? ? unique_ptr通过禁用拷贝构造函数和=复制语句来避免auto_ptr的情况,不过可以使用=来进行移动构造。用法如下:

#include<memory>
#include<iostream>

int main() {
	std::unique_ptr<int32_t> p(new int32_t(10));	//创建时指定动态对象
	std::unique_ptr<int32_t> q;	//创建空智能指针
	q.reset(new int32_t(9));	//绑定对象
	std::cout << *p;
	std::cout << *q.get();	//q.get()得到普通指针int32_t*

	std::unique_ptr<int32_t> f;
	f = std::move(q);	//移动构造函数赋值
	std::cout << *f;
	//std::cout << *q; 此时该语句是错误的,因为q的内容已经转移给了f,q是空指针

	return 0;
}

? ? ? ? 因此在使用auto_ptr的场景我们使用unique_ptr即可。

3.shared_ptr:

? ? ? ? 假如我们必须存在多个指向同一内存的智能指针,那么unique_ptr就不太合适了。此时我们可以使用shared_ptr,它通过引用计数的方式来记录同一块内存被指向的智能指针数,析构时会判断计数是否为1,如果是则释放,反之则减一且不释放。用法如下:

#include<memory>
#include<iostream>

int main() {
	std::shared_ptr<int32_t> p(new int32_t(10));	//创建时指定动态对象
	std::shared_ptr<int32_t> q = p;    //赋值
	std::shared_ptr<int32_t> f(new int32_t(9));
	f.swap(p);    //交换p和f的指向,但是等于p的q不会被交换
	std::cout << *p << ' ' << *q << ' ' << *f;    //输出9 10 10

	return 0;
}

? ? ? ? 引用计数的实现是采用一个int*指针实现的,当拷贝时新指针的int*指针指向原来的计数块。

? ? ? ? shared_ptr会出现内存泄漏问题,即循环引用,试想如下情况:

std::shared_ptr<node> p(new node());
std::shared_ptr<node> q(new node());
p->ptr = q;
q->ptr = p;

? ? ? ? 此时p和q的计数都是2,当析构时,p和q各计数减一,然后此时发现还有计数,因此不调用析构函数释放ptr,此时没有任何方式能拿到ptr,产生内存泄漏。

? ? ? ? shared_ptr在读的时候是线程安全的,但是在写的时候不是。

4.weak_ptr:

????????weak_ptr和shared_ptr共同使用可以解决循环引用问题。weak_ptr赋值时引用计数不加一。它的用法和shared_ptr几乎一样,且可以和shared_ptr互相使用=拷贝。

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

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