C++ 智能指针深入解析

yizhihongxing

C++ 智能指针深入解析

什么是智能指针?

在C++中,一个指针指向某个变量,但是由于指针是”裸”的,需要程序员显式地管理其生命周期。为了解决这个问题,C++11引入了智能指针。智能指针的用法和裸指针类似,但是会自动管理指针所指对象的生命周期。

智能指针的分类

C++中常用的智能指针有三种,它们分别是:

  • unique_ptr:独占所有权的智能指针
  • shared_ptr:共享所有权的智能指针
  • weak_ptr:弱引用的智能指针

unique_ptr

unique_ptr是一种独占所有权的智能指针,一旦一个unique_ptr指针指向了一个对象,其他的unique_ptr就不能再指向这个对象了。unique_ptr的对象的析构函数会自动释放所指向的内存。

下面是一个unique_ptr的示例:

#include <iostream>
#include <memory>

using namespace std;

int main() {
    unique_ptr<int> up(new int(42));
    cout << *up << endl;
    return 0;
}

在这个示例中,我们创建了一个unique_ptr,指向一个动态分配的int类型对象。在程序结束时,unique_ptr会自动释放指向的int对象的内存空间。

shared_ptr

shared_ptr是一种共享所有权的智能指针,可以多个shared_ptr指针同时指向一个对象。它的引用计数是线程安全的,也就是说,多个线程可以同时操作同一个shared_ptr。

下面是一个shared_ptr的示例:

#include <iostream>
#include <memory>

using namespace std;

int main() {
    shared_ptr<int> sp1(new int(42));
    shared_ptr<int> sp2 = sp1;
    cout << *sp1 << endl;
    cout << *sp2 << endl;
    return 0;
}

在这个示例中,我们创建了两个shared_ptr,它们指向同一个动态分配的int类型对象。在程序结束时,由于还有一个指向该对象的智能指针,所以内存空间没有被释放。

weak_ptr

weak_ptr是一种弱引用的智能指针,使用weak_ptr并不会增加对象的引用计数,也就是说,weak_ptr不会对对象的生命周期产生任何影响。

下面是一个weak_ptr的示例:

#include <iostream>
#include <memory>

using namespace std;

int main() {
    shared_ptr<int> sp(new int(42));
    weak_ptr<int> wp = sp;
    cout << *sp << endl;   // 正常输出
    cout << *wp.lock() << endl;   // 正常输出
    sp.reset();
    cout << *wp.lock() << endl;   // 输出0,因为对象已经被释放
    return 0;
}

在这个示例中,我们创建了一个shared_ptr,然后通过weak_ptr引用该shared_ptr指向的对象。当我们用lock()方法获取对象时,需要判断返回的指针是否为空,如果不为空则可以正常使用。

总结

智能指针是C++中非常重要的语言特性,能够很好地管理动态分配的内存,在编写现代C++代码时,推荐使用智能指针来管理内存。在具体使用时,需要根据不同的场景选择不同的智能指针类型,尤其需要注意内存泄漏的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 智能指针深入解析 - Python技术站

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

相关文章

  • Vue element ui用户展示页面的实例

    下面我将为你详细讲解“Vue element ui用户展示页面的实例”的完整攻略。 1. 环境配置 在开始使用Vue element ui之前,需要先进行环境配置。具体操作步骤如下: 安装Node.js:在Node.js官网下载对应系统的安装包,安装完成后,在命令行中输入node -v查看是否安装成功; 安装Vue CLI:在命令行中输入npm instal…

    C 2023年5月23日
    00
  • C++类与对象的重点知识点详细分析

    C++类与对象的重点知识点详细分析 什么是C++类和对象? 类是一种用户自定义的数据类型,它将数据的成员变量和行为的成员函数封装到一个单元中,用以描述现实世界中的对象,从而方便程序员编写复杂的业务逻辑。类的实例化对象称为对象,每个对象都有自己的数据和操作方法。C++中的类和对象是C语言的扩展,可以使用封装、继承和多态等特性实现OOP思想。 如何定义一个C++…

    C 2023年5月22日
    00
  • C语言实现扫雷游戏详解(附源码)

    C语言实现扫雷游戏详解(附源码) 导读 本文将详细讲述如何使用C语言实现扫雷游戏,包含游戏的逻辑和界面的实现。读者需要掌握C语言基础知识和游戏编程基础知识,同时需要熟悉常用的图形界面库如Windows API或GTK+。 整个游戏分为两个部分:游戏逻辑和图形界面。游戏逻辑部分实现游戏规则和逻辑,包含格子的生成、揭开和标记、游戏状态的控制等;图形界面部分实现游…

    C 2023年5月23日
    00
  • 华为Mate 8怎么样 华为Mate8全面评测图解

    华为Mate 8怎么样 华为Mate8全面评测图解 华为Mate 8是华为公司于2015年11月发布的一款大屏旗舰手机。其拥有6英寸的大屏幕、高通骁龙810处理器、4GB RAM、16/32/64GB ROM等高端配置,备受市场关注。下面我们来对这款手机进行全面评测,看看它在各方面的表现如何。 设计和外观 华为Mate8采用了一块6英寸的IPS LCD屏幕,…

    C 2023年5月22日
    00
  • C语言实现面向对象的方法详解

    C语言实现面向对象的方法详解 在C语言中实现面向对象的方法,主要有以下几种: 1. 结构体替代类 使用结构体来封装变量和函数,即可实现类似对象的功能。其中,结构体包含变量和函数指针,变量用于存储成员变量的值,函数指针用于实现成员函数的功能。而每个对象的变量是独立的,因此可以使用这种方法实现类似对象的功能。 下面是一个例子,以封装一个“人”的结构体为例: ty…

    C 2023年5月22日
    00
  • C++实现中值滤波的示例代码

    下面我将为您详细讲解C++实现中值滤波的示例代码的完整攻略。 什么是中值滤波? 中值滤波是一种基本的数字图像处理方法,它是一种非线性滤波器,可以消除图像中的噪声,保持边缘细节。中值滤波的原理是对滤波器窗口中的像素点进行排序,然后取中间的数值作为滤波结果。通常情况下,中值滤波器的窗口大小是一个奇数,如3×3、5×5等等。 C++中值滤波示例代码 在C++中实现…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 位运算符~的高级用法

    前言 在上一篇文章中,我们介绍了^运算符的高级用法,本篇文章,我们将介绍~ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、相反数 我们可以利用负数的补码性质,来获得一个正数的相反数 #include <stdio.h> int ma…

    C语言 2023年4月17日
    00
  • CDay03

    字符类型 编码 char类型采用ASCII编码,占1个字节,只用了7位(最高位是0),能表示128个字符。 需要记忆的: 空字符 ‘\0’ = 0 ‘ ‘ = 32 ‘0’ = 48 ‘A’ = 65 ‘a’ = 97 转义序列 字符转义序列 数字转义序列 八进制:以 \ 开头,后面最多接三个八进制数 十六进制:以 \x 开头,后面接十六进制数 字符处理函数…

    C语言 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部