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++ ] — 智能指针

一、三种智能指针

  • auto_ptr
  • unique_ptr
  • shared_ptr

(auto_ptr是C++98提供的方案,C++11已经将其摒弃,以下只是示例,实际不要使用auto_ptr)

使用new和delete管理动态内存常出现的问题:
(1)忘记delete内存
(2)使用已经释放的对象
(3)同一块内存释放两次

这三种智能指针模板都定义了类似指针的对象,可以将new获得的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete释放内存(内存被自动释放,无需手动delete)。

  • 智能指针模板位于名称空间中。
  • 要创建智能指针,必须包含头文件memory

二、使用智能指针

  • 可以对智能指针执行解引用操作( *ptr );
  • 可以用它来访问结构成员(ps->next);
  • 将它赋给指向相同类型的常规指针
  • 将智能指针对象赋给另一个同类型的智能指针对象时需要注意(unique_ptr和shared_ptr不同,下面会讲)
auto_ptr<typename> pd(new typename);
auto_ptr<double> pd(new double);
auto_ptr<string> pd(new string);

其中 new typename 是new返回的指针,指向新分配的内存块,是构造函数auto_ptr<double> 的参数。

#include <iostream>
#include <string>
#include <memory>
using namespace std;

class Report{
private:
	string str;
public:
	Report(const string s) : str(s){
		cout<<"Object created! \n";
	}
	~Report(){
		cout<<"Object deleted!\n";
	}
	void comment() const{ cout<<str<<"\n";}
};
int main(){
	{
		auto_ptr<Report> ps(new Report("uing auto_ptr"));
		ps->comment();
	}
	//ps的作用域在代码块内
	{
		shared_ptr<Report> ps(new Report("uing shared_ptr"));
		ps->comment();
	}
	//ps的作用域在代码块内
	{
		unique_ptr<Report> ps(new Report("suing unique_ptr"));
		ps->comment();
	}
}

输出如下:
在这里插入图片描述
注意

  1. 所有指针都有一个explicit构造函数,该构造函数将指针作为参数。因此一下操作是不合法的:
shared_ptr<double> pd;
double* p =new double;
pd = p_reg; //非法
shared_ptr<double> pshared = p_reg;//非法
pd = shared_ptr<double>(preg); //合法
shared_pte<double> pshared(p_reg); //合法
  1. 不要用指向非堆内存的指针初始化智能指针对象,因为这将导致delete释放非堆内存,这是错误的。
string vacation("I love you.");
shared_ptr<string> pd(&vacation); //错误

三、unique_ptr指针

unique_ptr指针使用所有权模型,即对于特定的对象,只能由一个智能指针可拥有它,只有拥有对象的智能指针的构造函数会删除该对象。

unique_ptr<string> p1(new string("auto"));
unique_ptr<string> p2;
p2=p3; //报错

第三句会报错,编译器认为其非法。因为p2接管string对象后,p1的所有权将被剥夺,也就是p1不再指向有效数据。如果程序随后试图使用p1,将会发生问题。

但如果源unique_ptr是个临时右值,编译器允许这样做,
在这里插入图片描述
语句#2调用unique_ptr的构造函数的创建临时对象在将其所有权转让给pu3后就会被销毁。
在这里插入图片描述
C++的标准库函数std::move()让您能够将unique_ptr赋给另一个
在这里插入图片描述

四、shared_ptr指针

shared_ptr指针可以跟踪引用特定对象的智能指针数,赋值时,计数将+1,而指针过期时,计数-1。仅当最后一个指针过期时,才调用delete。
shared_ptr指针允许多个智能指针指向同一个对象。

五、选择智能指针

  • 如果程序要使用多个指向同一个对象的指针,应选择shared_ptr
  • 如果程序不需要多个指向同一个对象的指针,则可使用unique_ptr。

unique_ptr

  • 不使用new 或 new[ ] 分配内存时,不能使用unique_ptr

shared_ptr

  • 使用new分配内存时,才能使用shared_ptr
  • 使用new[ ]时,不能使用它
  • 不使用new分配内存时,不能使用它
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-09 20:57:15  更:2022-02-09 20:59:48 
 
开发: 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/26 18:22:39-

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