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日

相关文章

  • C++输入输出重定向方法示例

    下面是关于C++输入输出重定向方法示例的完整攻略。 什么是输入输出重定向? 输入输出重定向是指将一个程序的输入和输出从默认的控制台(即键盘和屏幕)转到指定的文件或设备上。在C++中,可以使用标准库中的一些函数和符号来实现输入输出重定向。 C++输入输出重定向的方法 1. 使用freopen函数进行输入输出重定向 在C++中,可以使用标准库中的freopen函…

    C 2023年5月22日
    00
  • 使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法

    下面是使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法的完整攻略。 准备工作 首先需要准备CEF2623的源代码和编译环境,确保以下步骤顺利进行。 下载CEF2623的源代码。可以到官网(https://bitbucket.org/chromiumembedded/cef/src/2623/)下载。 安装Visual…

    C 2023年5月23日
    00
  • 举例讲解C语言的fork()函数创建子进程的用法

    当我们编写多进程程序时,经常需要使用fork()函数创建子进程。在此为大家详细讲解C语言的fork()函数创建子进程的用法。 什么是fork()函数? fork()函数是一个创建进程的系统调用,调用一次生成两个进程(一个子进程和一个父进程)。两个进程都执行fork()调用后的下一条语句。这个新进程几乎与原先的进程完全一样,除了它有自己独特的进程ID,PID和…

    C 2023年5月23日
    00
  • c++ 数组定义及初始化详解

    C++ 数组定义及初始化详解 C++ 数组是一种集合相同类型数据的方式。在定义数组时,需要指定数组的数据类型,以及数组的大小。下面是数组的定义格式: 数据类型 数组名称 [数组大小]; 在数组定义后需要对数组进行初始化,否则数组中的元素可能会是未知状态。数组的初始化可以分为以下两种方式: 1.2.1 直接初始化 直接初始化是在定义数组时进行赋值,格式如下: …

    C 2023年5月23日
    00
  • python中的decimal类型转换实例详解

    下面就为大家详细讲解“Python中的decimal类型转换实例详解”的完整攻略。 概述 Python中的decimal类型是用于精确计算的浮点数,可以解决常规浮点数运算产生的误差问题。而在进行decimal类型的转换过程中,需要注意其精度和舍入模式等因素。 基本用法 创建decimal类型 要创建decimal类型,需要调用decimal模块中的Decim…

    C 2023年5月22日
    00
  • 基于Python实现二维图像双线性插值

    本文讲述如何使用Python实现二维图像的双线性插值方法。双线性插值是一种经典的图像插值方法,它可以用于在图像中寻找不存在的像素点的像素值。当像素点不存在时,通过双线性插值方法可以根据周围的像素点计算出不存在的像素点的值。下面详细讲解双线性插值的实现步骤和Python代码实现。 Step 1:了解双线性插值的原理 双线性插值就是在二维数学函数中按照一定的规律…

    C 2023年5月22日
    00
  • C语言实现学生信息管理系统开发

    C语言实现学生信息管理系统开发攻略 简介 学生信息管理系统是企事业单位、政府机关和社会组织等管理组织必不可少的一项基础工作,管理学生信息可以提高工作效率,有效保证了各项工作的有序开展。本文将以C语言为开发语言,实现学生信息管理系统的开发。 开发工具 开发学生信息管理系统的首选是C语言,然后我们需要一款好用的IDE进行编写,比如Visual Studio Co…

    C 2023年5月23日
    00
  • 介绍C语言程序中的注释等辅助语句如何使用

    以下是介绍C语言程序中的注释等辅助语句如何使用的攻略: 一、注释的作用 注释在C语言程序中十分重要,可以提高代码的可读性和可维护性。注释是在程序中添加一些说明性文字,可以使其他人更容易理解代码的意图和行为。注释在程序的后期维护和修改中也十分有用,可以使代码更易于修改和调试。 二、注释的使用方式 在C语言中,有两种注释方式: 1. 单行注释 单行注释以“//”…

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