首页 > 编程语言 >【C++11及其特性】智能指针——shared_ptr

【C++11及其特性】智能指针——shared_ptr

时间:2024-09-08 16:24:47浏览次数:7  
标签:11 计数 sp C++ 智能 shared ptr 指针

大家好,这里是国中之林!
❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←

shared_ptr目录

一.共享性智能指针

unique_ptr是排他性的,对于同一块地址的指针,只能一个智能指针进行管理.

那么共享性的就是,对于同一块地址的指针,可以有多个智能指针进行管理.

二.shared_ptr的共享原理

智能指针中会存在一个用来计数的函数,就是指向同一块地址指针的智能指针数量.

在这里插入图片描述
运行结果:
在这里插入图片描述
p1本来没有指向指针,计数为0.
p2指向指针new Person(2),计数为1.
当p1=p2时,p1也就指向p2指向的指针了,计数为2.
拷贝同样如此.
当某一个智能指针生命周期结束时,计数就会减1,当减为0时,就会调用析构,释放内存.

三.shared_ptr的构造函数

1.普通的

在这里插入图片描述

2.数组的

在这里插入图片描述

3.带删除器的

在这里插入图片描述

在这里插入图片描述

四.shared_ptr的初始化

1.通过构造

在这里插入图片描述

2.make_shared

在这里插入图片描述

五.shared_ptr的主动释放

1.空

在这里插入图片描述

2.重置

在这里插入图片描述

六.shared_ptr的重置

1.空

在这里插入图片描述

2.其他指针

在这里插入图片描述

3.带删除器

在这里插入图片描述

七.shared_ptr的交换

在这里插入图片描述

八.shared_ptr的使用陷阱

#include <iostream>
using namespace std;

class girl;

class boy
{
public:
	boy()
	{
		cout << "boy 构造函数!" << endl;
	}

	~boy()
	{
		cout << "boy 析构函数!" << endl;
	}

	void set_girlfriend(shared_ptr<girl>& sp)
	{
		m_sp = sp;
	}

private:
	shared_ptr<girl> m_sp;
};

class girl
{
public:
	girl()
	{
		cout << "girl 构造函数!" << endl;
	}

	~girl()
	{
		cout << "girl 析构函数!" << endl;
	}

	void set_girlfriend(shared_ptr<boy>& sp)
	{
		m_sp = sp;
	}

private:
	shared_ptr<boy> m_sp;
};

void use_trap()
{
	shared_ptr<boy>b(new boy());
	shared_ptr<girl>g(new girl());

	b->set_girlfriend(g);
	g->set_girlfriend(b);
}

int main()
{
	use_trap();

	system("pause");
	return 0;
}

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

当智能指针被当做参数传给别人时,会多一个指向,计数加一.
即使这里智能指针的生命周期结束,但是还是不能将其释放内存.

标签:11,计数,sp,C++,智能,shared,ptr,指针
From: https://blog.csdn.net/qq_74047911/article/details/141857396

相关文章

  • 【C++】智能指针
    目录1.智能指针简介2. std::unique_ptr2.1.特点2.2.使用示例3. std::shared_ptr3.1.特点3.2.使用示例4. std::weak_ptr4.1.特点4.2.使用示例5.使用智能指针的注意事项5.1.选择合适的智能指针类型5.2.避免循环引用5.3.谨慎使用自定义删除器5.4.注......
  • Linux 下 C/C++ 程序编译的过程
    目录一、GCC工具链二、编译过程1、预处理2、编译3、汇编4、链接本文将介绍如何将C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤:预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)。在此之前,首先来看一下GCC工具链。......
  • 题解:P11020 「LAOI-6」Radiation
    我们发现一种最优策略,把石头按照斜线摆,即(1,1),......
  • C++11/14/17/20 新特性反汇编分析1
    区间for迭代类似于java中的foreach看个例子:数组的区间for迭代我们从第一行开始看,首先把数组a的地址放到eax中,再把eax的值放到[ebp-28h]中,也就是[ebp-28h]存储了元素的首地址,同理[ebp-34h]也存了a的首地址(这里猜测可能是多个变......
  • c++IOS优化【原创】
    这一期,我们来讲IOS优化,上一期讲了GCC的优化,这次给大家带来的是IOS优化,代码如下。ios::sync_stdio(0),cin.tie(),cout.tie();ios::sync_with_stdio(0):默认情况下,C++的标准输入输出流(cin/cout)会与C语言的标准输入输出流(scanf/printf)同步。这可能会导致一些性能开销。当使用......
  • 状压DP(c++)
    好久都没来水博客了,现在闲的来写一篇刚学的状压DP思想状压DP要把一个集合中的所有元素一一分别拿出来讨论,需要用到二进制保存集合状态例如110001010二进制,0代表没有,1代表有这个元素876543210他的位置所有状压dp差不多就一个思想逐步将集合中的点包含进来首先引入一道题......
  • C++STL之stack和queue容器适配器:基本使用及模拟实现
    目录stack的介绍和使用stack的介绍stack的使用queue的介绍和使用queue的介绍queue的使用priority_queue的介绍和使用priority_queue的介绍priority_queue的使用deque双端队列(容器)deque的介绍及使用deque的缺点deque的原理(了解)容器适配器概念stack和queue的......
  • C++ 模板进阶知识——完美转发
    目录C++模板进阶知识——完美转发1.完美转发的步骤演绎完美转发的关键点2.std::forward2.1工作原理2.2重要性3.普通参数的完美转发4.在构造函数模板中使用完美转发范例5.在可变参数模板中使用完美转发范例5.1常规的在可变参模板中使用完美转发5.2将目标函数......
  • P11019 「LAOI-6」[太阳]] 请使用最新版手机 QQ 体验新功能 题解
    非常简单的模拟题。由题意得,即找出输入字符串中,用[]围起来的片段中的大写字母\(A_1,A_2,A_3...A_n\)然后将其转换为小写输出\(/a_1a_2a_3...a_n\)即可。#include<bits/stdc++.h>#defineseq(q,w,e)for(intq=w;q<=e;q++)#definelllonglongusingnamespace......
  • P11020 「LAOI-6」Radiation 题解
    一道简单的构造题,其实不用想的十分复杂的说。首先,最多发射的宇宙射线\(sum\)也最多为\(sum_{max}=min(m,n)\)也就是说,无论如何摆放石子,也只能达到这个数量。那么我们的目的便变成了如何让石子变成这一个形状。如上图,在一个\(3\times6\)的矩阵中,其实只要三颗石子即可满足......