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。