首页 > 其他分享 >shared_ptr 共享指针

shared_ptr 共享指针

时间:2024-08-12 12:38:05浏览次数:13  
标签:use rosnoetic shared ptr VirtualBox 指针

shared_ptr 共享指针

参考教程:

善用shared_ptr,远离内存泄漏 - 知乎 (zhihu.com)

1. 编写 use_shared_ptr

1.1 创建文件夹

通过终端创建一个名为use_shared_ptr的文件夹以保存我们的VSCode项目,在/use_shared_ptr目录下打开vscode

rosnoetic@rosnoetic-VirtualBox:~$ mkdir -p use_shared_ptr

rosnoetic@rosnoetic-VirtualBox:~$ cd use_shared_ptr/

rosnoetic@rosnoetic-VirtualBox:~/use_shared_ptr$ code .

1.2 编写源代码

新建文件use_shared_ptr.cpp

use_shared_ptr.cpp粘贴如下代码并保存(Ctrl+S)

// 添加iostream头文件,用于输出信息到终端
#include <iostream>
// 添加memory,共享指针需要用到
#include <memory>
// 后续声明string类型需要用到
#include <string>

// 值传递会增加共享指针的计数
// 定义func0的传参为共享指针
void func(std::shared_ptr<int> sp){
    // 输出共享指针的计数
    std::cout << "func:" << sp.use_count() << std::endl;
}

// 定义函数主入口
int main(int argc , char  argv){

   // 声明一个指向int类型的指针
   std::shared_ptr<int> sp1(new int(42));
    // 使用make_shared声明共享指针
    auto sp2 = std::make_shared<std::string>("hello");
    // 声明一个指向int类型的指针
    std::shared_ptr<int> sp3;
    sp3.reset(new int(42));

    // 输出sp1的引用计数
    std:: cout << "sp: "<< sp1.use_count() <<std::endl;
    // 调用func函数
    func(sp1);
    // 执行完函数后,再次输出sp1计数
    std::cout << "sp: " << sp1.use_count() << std::endl;

    // 输出sp1的结果,共享指针既然是叫指针,那么就必然拥有指针的取值特性
    std::cout << "取值: " << *sp1 << std::endl;

    return 0;
}

2. 新建 CMakeLists.txt 文件

新建CMakeLists.txt文件

CMakeLists.txt中添加如下内容:

# 声明cmake最小版本
cmake_minimum_required(VERSION 2.8)

# 定义项目名称
project(USE_SHARED_PTR)

# 添加可执行文件
add_executable(use_shared_ptr use_shared_ptr.cpp)

3. 编译

ctrl+alt+T打开终端,执行如下指令进行cmake编译

rosnoetic@rosnoetic-VirtualBox:~$ cd use_shared_ptr/

rosnoetic@rosnoetic-VirtualBox:~/use_shared_ptr$ mkdir build

rosnoetic@rosnoetic-VirtualBox:~/use_shared_ptr$ cd build/

rosnoetic@rosnoetic-VirtualBox:~/use_shared_ptr/build$ cmake ..

接着make对工程进行编译

rosnoetic@rosnoetic-VirtualBox:~/use_shared_ptr/build$ make

进一步的调用可执行文件:

rosnoetic@rosnoetic-VirtualBox:~/use_shared_ptr/build$ ./use_shared_ptr 

从这个结果可以看到,初始创建的时候sp1的计数为1,接着执行func函数,函数会拷贝一份指针,并使其引用计数+1,接着函数执行完毕,由于是值传递,所存储的变量在栈区,因此使用完成后就会释放,从而函数执行之后,引用计数-1,又变回了原来的1。

标签:use,rosnoetic,shared,ptr,VirtualBox,指针
From: https://www.cnblogs.com/windandchimes/p/18354730

相关文章

  • 函数指针数组的应用-转移表
    函数指针数组的概念数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组,⽐如:数组的每个元素是int*类型。而函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的,比如:那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如......
  • C语言:指针
     目录指针变量和地址取地址操作符指针变量的大小指针变量类型意义指针解引⽤指针的+-整数const修饰指针const修饰变量const修饰指针变量指针的运算指针+-整数 指针的关系运算野指针指针未初始化 指针越界访问指针指向的空间被释放了避免野指针assert......
  • 指针(一)
    1.内存和地址1.1内存我们在学校里住宿的话,学校会给我们分配宿舍,每个人都会有自己的位置。那么当我们需要在学校里面找的时候,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给每个房间编上号,1楼,101,102,103,104....2楼,201,202,203,204....3楼,301,..................
  • 【C++算法】双指针
    移动零题目链接:移动零https://leetcode.cn/problems/move-zeroes/description/算法原理这类题是属于数组划分、数组分开题型代码步骤:使用cur遍历数组当cur所指的元素等于0时,cur向后面移动当cur所指的元素不等于0时,dest向后面移动,cur所指元素与dest移动后所指的元素交换当......
  • 指针学习(1)(1)
    目录1.指针变量和地址1.1取地址操作符(&)1.2指针变量1.3拆解指针 1.4解引用操作符(*)1.5指针类型的大小1.6void*指针 2.const修饰指针2.1const修饰变量2.2const修饰指针变量2.2.1const在*左边2.2.2const在*右边  2.2.3const在*两侧 结论: 1.指针变量和地......
  • 简单在 WinUI 仿造 WPF 的 ColumnDefinition SharedSizeGroup 共享列宽功能
    本文将告诉大家如何在WinUI3或UNO里面,仿造WPF的ColumnDefinitionSharedSizeGroup共享列宽功能本文的实现代码是大量从https://github.com/Qiu233/WinUISharedSizeGroup抄的,感谢大佬提供的代码。我在此基础上简化了对Behavior的依赖,在本文末尾放上了全部代码的下载......
  • C语言学习笔记 Day11(指针--下)
    Day11 内容梳理:目录Chapter7 指针7.6指针&函数(1)形参改变实参的值(2)字符数组作为函数参数1)合并字符串2)删掉字符串中空格(3)指针作为函数返回值Chapter7 指针7.6指针&函数(1)形参改变实参的值前文提到形参无法改变实参,但是通过使用指针就可以改变。因为在......
  • 「LeetCode Top100」之双指针
    283.移动零题目链接:https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked题目难度:简单标签:数组、双指针题目状态:AC思路:两个指针,i用来找0,j用来找非0。当nums[i]==0&&nums[j]!=0时,将两者交换。代码:classSolutio......
  • 指针常量和常量指针的区别
    1.指针常量(ConstantPointer)定义:顾名思义指针常量是一个指针,它本身是常量,指向的地址不能改变,但可以改变指针所指向的值,(速记:指针是常量)声明:在C或C++中,可以使用const关键字来声明指针常量。例如:inta=10;int*constptr=&a;行为:在这个例子中,ptr......
  • C语言指针变量详解(函数指针,函数指针数组,转移表)
    指针变量 1.字符指针变量在指针的类型中我们知道有⼀种指针类型为字符指针char*;⼀般使⽤:intmain(){charch='w';char*pc=&ch;*pc='w';return0;}还有⼀种使⽤⽅式如下:intmain(){const......