shared_ptr 共享指针

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。

posted on 2024-08-12 12:43  守望者与托养者  阅读(16)  评论(0编辑  收藏  举报