一文掌握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日

相关文章

  • MFC实现学生选课系统

    MFC实现学生选课系统攻略 1. 前言 学生选课系统是大学教学管理系统中必不可少的一部分,本文介绍如何使用MFC来实现一个学生选课系统,包括系统框架设计、用户界面设计以及基本功能实现等部分内容。 2. 系统框架设计 2.1 整体思路 学生选课系统主要包含两个模块:学生信息管理模块和课程信息管理模块。首先需要创建一个主窗口来容纳所有的子窗口,并通过主窗口提供菜…

    C 2023年5月23日
    00
  • C++使用easyx画实时走动的钟表

    C++是一种强大的编程语言,而easyx是一款很棒的图形库,可用于制作各种有趣的图形化应用程序。本文将为大家介绍如何使用C++和easyx画实时走动的钟表。 步骤一:准备工作 在开始之前,需要下载easyx图形库并安装。easyx官方网站提供了最新的安装程序,实际上安装很简单,只需双击运行安装程序即可完成安装。安装后,在Visual Studio中创建一个空…

    C 2023年5月23日
    00
  • 详解C语言初阶基础

    详解C语言初阶基础 C语言是一种强大的编程语言,可用于编写操作系统、游戏、桌面应用程序等。本文将详细介绍C语言的初阶基础,以帮助初学者快速掌握C语言的入门知识。 1. C语言的基本概念 C语言是一种结构化的高级编程语言,最初由Dennis Ritchie于1972年开发。它是一门静态类型的编程语言,意味着在编写代码时,程序员必须声明变量的类型,而且一旦声明后…

    C 2023年5月23日
    00
  • 如何修复错误0xC1900101?Win11安装助手错误代码0xc1900101的原因以及解决方法

    接下来我将详细讲解一下如何修复错误0xC1900101以及Win11安装助手错误代码0xc1900101的原因以及解决方法。 什么是错误0xC1900101? 错误0xC1900101是在Windows 10或Windows 11升级时通常发生的一种错误。这个错误通常表示升级过程出现了某种问题,导致升级无法完成。具体来讲,错误0xC1900101表示在升级过…

    C 2023年5月23日
    00
  • C++实现会员管理程序

    让我详细讲解一下C++实现会员管理程序的完整攻略。首先需要确保已经安装好编译器,如Dev C++或Code::Blocks等。 步骤1:设计类 会员管理程序需要设计一个会员类,可以包含以下成员变量: 姓名 身份证号 电话号码 邮箱 注册时间 并且还需要实现以下成员函数: 构造函数 获取姓名、身份证号、电话号码、邮箱、注册时间的函数 设置姓名、身份证号、电话号…

    C 2023年5月30日
    00
  • 详解MD5算法的原理以及C#和JS的实现

    详解MD5算法的原理以及C#和JS的实现 什么是MD5? MD5(Message Digest Algorithm 5) 是一种数字签名算法,用于确保数据的完整性和一致性,是最常用的摘要算法之一,不可逆且不唯一。 MD5算法可以将任意长度的文本映射成固定长度的文本,通常为32位的16进制数。MD5生成的结果具有一定的唯一性和随机性,相同输入生成的结果相同,不…

    C 2023年5月23日
    00
  • win10系统自带的计算器C和CE功能有什么区别?

    当我们使用win10系统自带的计算器时,会发现有两个按钮分别标注为“C”和“CE”,这两个按钮的作用都是清空计算器上的内容。但是,它们之间存在着一些区别。 首先,C是Clear的缩写,即清除所有计算器上的数字,包括之前的计算结果。而CE是Clear Entry的缩写,即只清除计算器上当前输入栏中的数字,之前的计算结果不会被修改或影响。 接下来,我将用两条示例…

    C 2023年5月22日
    00
  • C语言常用库函数的使用及模拟实现详解例举

    C语言常用库函数的使用及模拟实现详解 C语言是一门非常常用的编程语言,这门语言有很多常用的库函数,这些库函数可以让我们更加方便、快速地完成代码的编写,同时,了解这些库函数的使用,也能够让我们更深刻地理解C语言的语法和特性。 常用库函数的使用 字符串操作库函数 字符串操作是C语言中最常用的操作之一,C语言提供了很多常用的字符串操作库函数,我们常用的字符串操作函…

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