C++11智能指针中的 unique_ptr实例详解

C++11智能指针中的 unique_ptr实例详解

简介

在C++11中,引入了新的智能指针模板类unique_ptr,它能自动管理动态内存,从而避免内存泄漏和野指针等问题。unique_ptr是一个独占式智能指针,它禁止拷贝和赋值,并在生命周期结束时自动释放内存。

本篇文章将详细介绍unique_ptr的使用方法和注意事项,并结合实例进行说明。

unique_ptr的使用

创建unique_ptr

使用unique_ptr最基本的操作是通过new关键字来创建动态内存并将其封装到unique_ptr对象中。创建unique_ptr的方法如下:

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

上述代码中,我们创建了一个名为ptr的unique_ptr对象,它持有一个动态分配的整型变量,并将其初始化为10。

但是,unique_ptr是独占式智能指针,它禁止拷贝和赋值,因此不能像普通指针一样进行赋值操作。例如,下面的代码是错误的:

std::unique_ptr<int> ptr1(new int(10));
std::unique_ptr<int> ptr2 = ptr1;

由于unique_ptr禁止拷贝和赋值,因此上述代码会导致编译错误。

unique_ptr的释放

unique_ptr在生命周期结束时自动释放动态内存,这个过程叫做unique_ptr的“析构”。unique_ptr的析构函数会自动调用delete操作符,从而释放其所持有的动态内存。下面的代码展示了unique_ptr的析构过程:

{
    std::unique_ptr<int> ptr(new int(10));
} // ptr的生命周期结束,指向的动态内存将被自动释放

获取unique_ptr所持有的指针

我们可以通过unique_ptr的get()成员函数来获取unique_ptr所持有的指针。下面的代码展示了如何使用get()函数:

std::unique_ptr<int> ptr(new int(10));
int* p = ptr.get(); // p指向ptr所持有的动态内存

使用unique_ptr作为函数参数

unique_ptr可以作为函数参数传递。由于unique_ptr禁止拷贝和赋值,因此函数参数只能通过引用或移动语义来传递unique_ptr。

下面的代码展示了如何在函数中使用unique_ptr:

void func(std::unique_ptr<int>& ptr) {
    // do some operations with ptr
} // ptr的生命周期结束,指向的动态内存将被自动释放

std::unique_ptr<int> ptr(new int(10));
func(ptr); // 传递unique_ptr的引用

将指针交换给unique_ptr

我们可以使用unique_ptr的swap()成员函数将一个指针交换给unique_ptr,这样可以让unique_ptr接管原指针的所有权。

int* p = new int(10);
std::unique_ptr<int> ptr;
ptr.swap(std::unique_ptr<int>(p)); // 将指针p交换给ptr,ptr现在持有p的所有权

重置unique_ptr

unique_ptr提供了reset()函数用于释放原指针并重新指向新的指针。

std::unique_ptr<int> ptr(new int(10));
ptr.reset(new int(20)); // 释放原指针并指向新的指针

unique_ptr的实例

示例一:在函数中返回unique_ptr

下面的代码展示了如何在函数中使用unique_ptr,通过返回unique_ptr来避免内存泄漏的问题。

// 返回一个unique_ptr,该指针持有一个动态分配的字符串对象
std::unique_ptr<std::string> getString() {
    std::unique_ptr<std::string> ptr(new std::string("hello world"));
    return ptr; // 返回unique_ptr
}

void printString() {
    std::unique_ptr<std::string> str = getString(); // 获取返回的unique_ptr
    std::cout << *str << std::endl;
} // str的生命周期结束,指向的动态内存将被自动释放

int main() {
    printString();
    return 0;
}

上述代码中,getString()函数返回一个unique_ptr,该指针持有一个动态分配的字符串对象。由于返回的是unique_ptr,因此函数结束时该指针会被自动释放,从而避免了内存泄漏的问题。

示例二:使用lambda式创建unique_ptr

下面的代码展示了如何使用lambda式来创建unique_ptr对象。

auto ptr = std::unique_ptr<int>(new int(10));
std::unique_ptr<int> ptr2([=]() {
    auto p = new int(20);
    *p += *ptr;
    return p;
}()); // 使用lambda式创建unique_ptr,该指针持有一个动态分配的整型变量

上述代码中,我们首先使用new关键字创建一个动态分配的整型变量,并将其封装到unique_ptr对象中。然后,我们使用lambda式创建了一个新的unique_ptr对象,它持有另一个动态分配的整型变量,该变量的值为原指针的值加上10。

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

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

相关文章

  • 解决Vue-Router升级导致的Uncaught (in promise)问题

    当将Vue-Router从版本2升级到版本3时,可能会遇到一个非常常见的问题,就是Uncaught (in promise)错误。这是由于Vue-Router版本3采用了Promise API,而在旧版中未正确使用Promise时造成的。 要解决这个问题,有以下两个简单的步骤: 步骤一:升级Vue-Router到最新版本 首先要确保已将Vue-Router版…

    C 2023年5月23日
    00
  • C语言错误使用sizeof操作符

    介绍C语言中错误使用sizeof操作符的完整使用攻略。 什么是 sizeof 操作符 sizeof是C语言中的一元操作符,用于计算某个数据类型所占内存的字节数。其用法如下: sizeof(type) 其中 type 可以是任何C语言中的数据类型,包括基本数据类型、数组、结构体、联合体或指针等。 错误用法示例 sizeof 数组 有些C语言开发者会尝试使用si…

    C 2023年5月9日
    00
  • Flash Actionscript 优化指南

    Flash Actionscript 优化指南 为什么需要优化 在开发复杂的Flash应用程序时,如不进行优化,可能出现以下问题: 程序速度变慢,用户体验变差。 耗费更多的CPU周期和内存,使程序更容易崩溃。 代码杂乱无章,难以维护和扩展。 因此,优化是每个Flash开发人员必须掌握的技能。 优化方法 以下是几种常见的优化方法: 1. 尽量避免使用深度嵌套显…

    C 2023年5月22日
    00
  • Qt利用ffmpeg实现音视频同步

    我将详细讲解“Qt利用ffmpeg实现音视频同步”的完整攻略。 1. 确定开发环境 首先,我们需要安装Qt和ffmpeg。Qt是一个跨平台的C++应用程序开发框架,可以用于开发Windows、MacOS、Linux等应用程序,而ffmpeg是一个广泛使用的开源跨平台的音视频处理工具。 2. 引入ffmpeg开发库 在Qt项目中使用ffmpeg,需要引入ffm…

    C 2023年5月22日
    00
  • C语言实现考试报名管理系统

    C语言实现考试报名管理系统攻略 系统介绍: 本系统使用C语言编写,实现了考试报名管理系统,可以方便地管理考试的报名、查询与统计工作。 系统功能: 学生信息管理:系统中可以管理考生信息,包括学生姓名、学号、报考考试、成绩等信息。 考试报名:考生可以通过登录系统进行报名。 考试查询:考生和管理员根据个人信息可以查询自己或其他考生的成绩,并且管理员可以查看全体考生…

    C 2023年5月23日
    00
  • 深入解析C++编程中__alignof 与__uuidof运算符的使用

    深入解析C++编程中__alignof 与__uuidof运算符的使用 __alignof 运算符 __alignof 运算符用来获取一个类型所需的对齐宽度,也就是该类型所占空间的整数倍。其语法如下: alignof(type) 其中,type 表示类型,可以是内置类型、用户自定义类型、指针类型、引用类型等。 示例1: #include <iostre…

    C 2023年5月23日
    00
  • C++实现STL容器的示例

    实现STL容器需要了解C++的模板和泛型编程。具体实现步骤如下: 1.先定义STL容器的基本结构,以vector为例,定义一个模板类Vector,将模板参数T作为类型参数: template <typename T> class Vector { private: T* data; size_t size; size_t capacity; pu…

    C 2023年5月23日
    00
  • JavaScript调用C语言的几种方式

    JavaScript调用C语言的几种方式: WebAssembly(wasm) WebAssembly 是一个可以在多种语言中使用的虚拟机,可以进行跨编程语言的编译,目前已经成为最流行的实现方式。我们可以使用 C、C++、Rust 等语言编写 WebAssembly 模块,然后在 JavaScript 中以相似的语法引用。 示例: 下面是 C 语言示例代码,…

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