C++Smart Pointer 智能指针详解

yizhihongxing

C++ Smart Pointer 智能指针详解

1. 什么是智能指针?

智能指针是一个用于指针管理的封装类,它能够自动释放内存。相比于简单的指针,智能指针能更好地控制对象的生命周期,避免一些常见的bug,如内存泄露和野指针。

2. 常见的智能指针类型

C++中常见的智能指针类型有三种:

2.1. unique_ptr

unique_ptr是C++11标准中引入的一种独享所有权的智能指针,它使用移动语义来避免拷贝和赋值。具有unique_ptr的对象是独立的,不能被多个unique_ptr对象共享。

#include <memory>

std::unique_ptr<int> ptr(new int(42));

// 使用make_unique来创建unique_ptr
auto ptr = std::make_unique<int>(42);

2.2. shared_ptr

shared_ptr是一种共享所有权的智能指针,可以被多个shared_ptr对象共享。shared_ptr使用引用计数来管理对象的生命周期,当最后一个shared_ptr对象销毁时,才会自动释放内存。

#include <memory>

std::shared_ptr<int> ptr1(new int(42));
std::shared_ptr<int> ptr2 = ptr1; // 共享所有权

// 使用make_shared来创建shared_ptr
auto ptr = std::make_shared<int>(42);

2.3. weak_ptr

weak_ptr是一种弱引用的智能指针,它指向的对象可能已经被销毁或者空指针。weak_ptr用于解决shared_ptr的循环引用问题。

#include <memory>

std::shared_ptr<int> strong_ptr(new int(42));
std::weak_ptr<int> weak_ptr = strong_ptr; // 弱引用

// 构造使用std::weak_ptr的shared_ptr
auto shared_from_weak = weak_ptr.lock();

3. 智能指针的使用示例

3.1. unique_ptr示例

#include <memory>

struct Foo {
    Foo() { std::cout << "Foo constructed\n"; }
    ~Foo() { std::cout << "Foo destructed\n"; }
};

int main() {
    std::unique_ptr<Foo> foo_ptr(new Foo);
    // do something with foo_ptr
    return 0;
}

3.2. shared_ptr示例

#include <memory>

struct Foo {
    Foo() { std::cout << "Foo constructed\n"; }
    ~Foo() { std::cout << "Foo destructed\n"; }
};

int main() {
    std::shared_ptr<Foo> foo_ptr1(new Foo);
    std::shared_ptr<Foo> foo_ptr2 = foo_ptr1;
    // do something with foo_ptr1 and foo_ptr2
    return 0;
}

4. 总结

智能指针是C++中的一个重要概念,可以有效地提高代码的安全性和可维护性。在使用智能指针时应该注意内存泄露和循环引用的问题,避免使用裸指针,选择合适的智能指针类型可以使代码更加健壮。

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

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

相关文章

  • JS将网址url转化为JSON格式的方法

    将网址URL转换为JSON格式是一种常见的操作。下面是一些步骤,可帮助您使用JavaScript在JSON中使用网址: 创建URL对象。 使用JavaScript的URL对象,可以将网址转换为URL对象。例如,下面的代码将创建一个URL对象: const url = new URL(‘https://www.example.com/test/?id=123#…

    C 2023年5月23日
    00
  • 从汇编看c++中默认构造函数的使用分析

    请看以下完整攻略: 从汇编看C++中默认构造函数的使用分析 什么是汇编? 首先,我们需要了解什么是汇编。汇编语言是一种低级别的程序设计语言,它使用助记符(mnemonic)来代替二进制码的操作码。汇编语言是一种与硬件紧密相关的语言,它在一定程度上可以直接操作计算机硬件。 C++中的默认构造函数 在C++中,如果不为类定义构造函数,则会自动生成一个默认构造函数…

    C 2023年5月22日
    00
  • C语言字符串初始化

    C语言中的字符串是一系列连续的字符组成的字符数组,并以’\0’作为结尾的特殊字符,也称为字符串终止符。字符串初始化是将字符串常量赋值给一个字符数组的过程,下面是关于如何初始化C语言字符串的详细步骤及示例说明: 字符串初始化的语法 C语言字符串的初始化方式有两种,分别是字符数组方式和指针方式。 字符数组方式 char str[] = {‘H’, ‘e’, ‘l…

    C 2023年5月9日
    00
  • C语言实现简易版三子棋游戏

    C语言实现简易版三子棋游戏攻略 准备工作 在进行代码编写前,需要掌握以下知识: 基本的C语言语法 数组的使用和遍历 循环和条件语句的使用 头文件的引用 实现步骤 第一步:创建游戏地图 我们需要创建一个棋盘,即一个三行三列的矩阵,用来存储游戏进程和结果。因此我们需要在游戏源代码文件中,使用数组来创建这个棋盘,并对游戏盘进行初始化。示例代码如下: char bo…

    C 2023年5月23日
    00
  • C++简单又轻松建立链式二叉树流程

    下面是关于“C++简单又轻松建立链式二叉树”的攻略。 什么是链式二叉树 链式二叉树是一种常见的树形结构,它由多个节点构成,每个节点可以有左子树、右子树和父节点。链式二叉树的特点是不需要连续的内存空间,因此它的插入和删除操作非常方便。 如何建立链式二叉树 在C++中,我们可以使用结构体表示每个二叉树节点,具体实现方式如下: struct TreeNode { …

    C 2023年5月30日
    00
  • 使用系统默认的备份还原注册表的图文教程

    使用系统默认的备份还原注册表的图文教程 首先,备份注册表非常重要。在我们进行一些重要的系统修改时,需要备份注册表以防万一。系统默认的备份功能十分实用,可以快速地恢复到之前的状态。以下是使用系统默认的备份还原注册表的步骤: 打开“运行”窗口 我们可以使用快捷键 Win + R 打开运行窗口。 输入 regedit 命令 在弹出的运行窗口中,输入 regedit…

    C 2023年5月23日
    00
  • C++ 搬水果贪心算法实现代码

    C++搬水果贪心算法实现代码的攻略如下: 什么是贪心算法? 贪心算法(Greedy Algorithm)又称贪心策略,是指在利用当前信息的情况下,做出当下最优的选择。贪心算法不会考虑到全局的最优解,而只关注当下的最优解。贪心算法在求解最优解的过程中,通常需要证明其正确性,并且使用贪心算法求得的解不一定是全局最优解,但是可以得到比较优秀的近似解。 搬水果问题的…

    C 2023年5月22日
    00
  • C#实现任意数据类型转成json格式输出

    C#是一种强类型语言,而JSON是一种轻量级的数据交换格式。在C#中,将任意数据类型转换为JSON格式可以便于进行数据传输、数据存储和Web服务请求等操作。下面是实现任意数据类型转换为JSON格式的攻略: 第一步:导入Json.NET库 在C#中,我们可以使用Json.NET库来实现JSON格式的转换。我们可以在Visual Studio中通过NuGet包管…

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