首页 > 编程语言 >C++ shared_ptr

C++ shared_ptr

时间:2022-09-20 22:24:46浏览次数:61  
标签:std int C++ new shared ptr 指针

shared_ptr

shared_ptr 是C++11提供的一种智能指针类,它足够智能,可以在任何地方都不使用时自动删除相关指针,从而帮助彻底消除内存泄漏和悬空指针的问题。

shared_ptr使用引用计数,每个shared_ptr的拷贝都指向相同的内存,在最后一个shared_ptr析构的时候,内存才会释放。

(1)初始化
可以通过构造函数、std::make_shared< T >辅助函数和reset方法来初始化shared_ptr:

  1. 使用原始指针建立智能指针
  2. std::make_shared 一次性为int对象和用于引用计数的数据都分配了内存,而new操作符只是为int分配了内存。
  3. reset:
    不带参数的reset(): 可以将引用计数减少1,如果引用计数变为0,则删除指针。
    带参数的reset():在这种情况下,它将在内部指向新指针,同时改变引用计数。
    还可以使用nullptr重置。

shared_ptr还重载了bool类型操作符来判断智能指针是否为空。

(2)获取原始指针
通过get方法返回原始指针。

#include <iostream>
#include <functional>
#include  <memory> 

void cout_p(std::shared_ptr<int> a){
    std::cout<<*a<<std::endl;
}

int main(void)
{
    std::shared_ptr<int> p1(new int (10)); 
    std::shared_ptr<int> p2 = std::make_shared<int>(); 
    cout_p(p1);
    *p2 = 200;
    cout_p(p2);

    std::shared_ptr<int> p3 = p1;
    std::cout<<p3.use_count()<<std::endl; //打印引用次数
    int* p = p1.get() //返回原始指针
}

(3)指定删除器
智能指针初始化可以指定删除器:
删除器可以是lambda表达式

注意:使用shared_ptr管理动态数组时,需要指定删除器,因为std::shared_ptr的默认删除器不支持数组对象

void mydel(int *p){
    delete p;
}
std::shared_ptr<int> p1(new int (10), mydel);
std::shared_ptr<int> p2(new int (10), [](int *p){delete p;}); // lambda表达式作为删除器
std::shared_ptr<int> p3(new int[10], [](int *p){delete[] p}); // 数组的删除器delete[]

使用shared_ptr需要注意的问题:

  1. 不要用一个原始指针初始化多个shared_ptr,会报错。
  2. 不要在函数实参中创建shared_ptr,有内存泄漏的风险。
    function (shared_ptr< int >(new int), g());
    因为C++的函数参数的计算顺序在不同的编译器中的调用约定可能是不一样的。可能先调用了new int,然后调用g(),如果这时g()发生异常,而shared_ptr还没创建,则发生内存泄漏。
  3. 不要将this指针作为shared_ptr返回,可能导致重复析构
  4. 不要重复引用

标签:std,int,C++,new,shared,ptr,指针
From: https://www.cnblogs.com/hy227/p/16712803.html

相关文章

  • T1036:A*B问题(信息学一本通C++)
     目录[题目描述]输入两个正整数A和B,求A*B的值。注意乘积的范围和数据类型的选择。[输入]一行,包含两个正整数A和B,中间用单个空格隔开。1≤A,B≤50000。[输出]两......
  • T1039:判断数正负(信息学一本通C++)
     目录[题目描述]给定一个整数NN,判断其正负。如果N>0,输出positive;如果N=0,输出zero;如果N<0,输出negative。[输入]输入一个整数N(−10^9≤N≤10^9)。[输出]如果N>0N>0,......
  • T1038:苹果和虫子(信息学一本通C++)
     目录[题目描述]你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多......
  • T1040:输出绝对值(信息学一本通C++)
     目录[题目描述]输入一个浮点数,输出这个浮点数的绝对值,保留到小数点后两位。[输入]输入一个浮点数,其绝对值不超过10000。[输出]输出这个浮点数的绝对值,保留到小数......
  • T1024:保留3位小数的浮点数(信息学一本通C++)
     目录[题目描述]读入一个单精度浮点数,保留3位小数输出这个浮点数。[输入]只有一行,一个单精度浮点数。[输出]也只有一行,读入的单精度浮点数。[输入样例]12.34521......
  • C++头破血流
    语法部分:宏定义DEFINE_int32(port,10086,"grpclisteningport");```#include#includeDEFINE_int32(port,10086,"grpclisteningport");```####err:“未......
  • C/C++文档编辑器
    C/C++文档编辑器程序设计题三:文档编辑器的设计与实现1系统的基本功能该系统要求对一个文本文件中的内容进行各种常规操作,如:插入、删除、查找、替换等功能。通过此课......
  • 自己精简 stdc++.h
    编译速度应该会快的(在本机)终端cd/usr/include/x86_64-linux-gnu/c++/9/bitssudogeanystdc++.h自己输密码(注意不会回显)然后自己精简://C++includesusedforp......
  • vs code C++错误提示
    如果不小心将错误提示给禁用了,打开.vscode文件夹下的setting.json文件。将最后以个个配置语句的值改为Enabled即可。......
  • C++学习笔记
    什么是对象?1、Object=Entity///对象是东西2、Objectisvariableinprogramminglanguage.///对象即变量3、Object=Attributes+ServicesData:theproper......