一文掌握C++ 智能指针全部用法

一文掌握C++智能指针全部用法

什么是智能指针

在C++中,当我们使用new操作符分配内存时,需要手动回收内存。如果忘记回收内存,就会出现内存泄漏等问题。为了解决这个问题,C++11引入了智能指针(Smart Pointer)。

智能指针是一种类,用来在动态分配的对象生命周期结束时自动释放该对象。它是指向动态分配的内存的类对象,这个类对象中承担了释放内存的责任。

智能指针的使用

C++的STL库中提供了两种类型的智能指针,分别是shared_ptr和unique_ptr。

shared_ptr

shared_ptr是共享的智能指针,它允许多个智能指针指向同一个对象。对于内存的释放,只有最后一个shared_ptr被销毁的时候才会释放。shared_ptr中使用引用计数方法,每增加一个智能指针,引用计数就+1,每销毁一个智能指针,引用计数就-1。当引用计数为0的时候,被共享的对象就会被销毁。

shared_ptr的定义方式为:

std::shared_ptr<int> p(new int);

通过make_shared函数创建shared_ptr的方式也很常见:

auto sp = std::make_shared<int>(42);

在赋值时,可以使用拷贝或移动语义,从一个shared_ptr移动指针:

auto sp1 = std::make_shared<int>(42);
auto sp2 = sp1; // increase ref count 1 -> 2
auto sp3 = std::move(sp1); // no change to ref count

unique_ptr

unique_ptr是唯一的智能指针,它不允许多个指针指向同一个对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。

unique_ptr的定义方式为:

std::unique_ptr<int> up(new int);

和shared_ptr相同,通过make_unique函数创建unique_ptr的方式也很常见:

auto up = std::make_unique<int>(42);

使用拷贝语义时,unique_ptr会禁用拷贝构造函数和赋值操作符:

std::unique_ptr<int> up1(new int(42));
std::unique_ptr<int> up2 = up1; // compile error - copy constructor deleted

要进行移动语义的赋值,可以使用std::move:

std::unique_ptr<int> up1(new int(42));
std::unique_ptr<int> up2 = std::move(up1); // move semantics

示例说明

示例一:shared_ptr

#include <memory> // for smart pointers
#include <iostream>

int main()
{
    auto sp1 = std::make_shared<int>(42);
    auto sp2 = sp1;

    std::cout << "sp1 ref count: " << sp1.use_count() << '\n';
    std::cout << "sp2 ref count: " << sp2.use_count() << '\n';
    return 0;
}

输出结果:

sp1 ref count: 2
sp2 ref count: 2

示例二:unique_ptr

#include <memory> // for smart pointers
#include <iostream>

int main()
{
    auto up1 = std::make_unique<int>(42);
    auto up2 = std::move(up1);

    std::cout << "up1 pointer: " << up1.get() << '\n';
    std::cout << "up2 pointer: " << up2.get() << '\n';
    return 0;
}

输出结果:

up1 pointer: 0
up2 pointer: 0x564ddad87a00

总结

C++的智能指针为我们带来了很多方便,可以有效的避免常见的内存泄漏问题。shared_ptr和unique_ptr是目前最常用的智能指针,根据使用场景进行选择即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文掌握C++ 智能指针全部用法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C程序 冒泡排序

    以下是详细讲解“C程序 冒泡排序”的完整使用攻略。 冒泡排序概述 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,一次比较两个元素,如果它们的顺序错误就把它们交换过来,直到没有元素需要交换,排序完成。 冒泡排序的时间复杂度为O(n²)。 以下是C语言中实现冒泡排序的代码示例: void bubble_sort(int *arr, int n) { i…

    C 2023年5月9日
    00
  • 酷睿i7-9700K处理器玩游戏怎么样 酷睿i7-9700K处理器游戏性能体验评测

    酷睿i7-9700K处理器玩游戏怎么样 介绍 酷睿i7-9700K处理器是英特尔推出的一款高端桌面处理器,采用了基于Coffee Lake架构的9代处理器。该处理器采用了8个物理核心和8个线程,主频频率为3.6GHz,支持Intel® 快速同步视频技术,最高Turbo频率可达到4.9GHz。 测试平台 为了测试该处理器的性能表现,我们搭建了以下测试平台: 处…

    C 2023年5月23日
    00
  • json2.js 入门教程之使用方法与实例分析

    JSON2.js 入门教程之使用方法与实例分析 什么是JSON2.js? JSON2.js是一个JavaScript库,旨在提供JSON对象的Polyfill,使得旧版浏览器支持JSON.stringify()和JSON.parse()方法。JSON2.js源于Douglas Crockford的json2.js(http://www.JSON.org/js…

    C 2023年5月23日
    00
  • 栈(顺序)的实现:括号的解析

    一、问题引入 在学习栈的过程中,教材有一个案例:利用栈结构解析括号的匹配问题。括号问题:[({}{})],说明 [] 、() 、{} 称为一对且满足就近匹配。 号码位置对应的括号之间进行匹配,结果:0-7、 1-6、 2-3、 4-5 源码链接https://github.com/caojun97/Bracket_Match 二、过程记录 2-1 栈的介绍 …

    C语言 2023年4月18日
    00
  • Objective-C Json 实例详解

    Objective-C Json 实例详解 什么是JSON? JSON是一种轻量级的数据交换格式,它是基于JavaScript对象语法的子集,易于人们理解和编写,也易于计算机解析和生成。在近年来的web开发中,JSON已经成为前后端数据交互最常用的格式之一。 使用Objective-C解析JSON 在Objective-C中,解析JSON非常方便,可以使用系…

    C 2023年5月23日
    00
  • C# Newtonsoft.Json 的使用说明

    C# Newtonsoft.Json是一个常用的Json操作库,使用它可以方便地实现Json格式的数据的序列化与反序列化。下面来详细讲解一下如何使用该库。 1. 安装Newtonsoft.Json 首先需要在项目中安装Newtonsoft.Json库。可以通过Nuget包管理器搜索 “Newtonsoft.Json” 进行安装,也可以从 官方网站 下载安装包…

    C 2023年5月23日
    00
  • 菜鸟记录:c语言实现PAT甲级1004–Counting Leaves

        好消息:与上题的Emergency是同样的方法。坏消息:又错了&&c++真的比c方便太多太多。 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.…

    C语言 2023年4月17日
    00
  • JSON基础介绍与详细用法

    JSON基础介绍与详细用法 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可以轻松地在不同语言和平台之间进行数据传输和交换。它的基本语法规则和JavaScript的语法规则类似,因此具有良好的可读性和可编写性。它采用键值对的形式进行数据存储,并支持嵌套、数组、对象等复杂数据结构。 在JSON中,…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部