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

相关文章

  • python对象与json相互转换的方法

    Python对象和JSON之间的互相转换是Web开发中经常使用的操作。这里提供两种方法,帮助你完成Python对象和JSON之间的转换。 方法一:使用Python内置的json模块 Python内置的json模块可以方便地将Python对象转换为JSON格式,反之同样适用。 将Python对象转换为JSON:使用json.dumps()函数,该函数接收一个P…

    C 2023年5月23日
    00
  • C++性能剖析教程之循环展开

    下面是关于“C++性能剖析教程之循环展开”的完整攻略: 1. 什么是循环展开 循环展开是一种优化技术,指将循环体语句复制若干次以减少分支和循环的开销,从而提高代码的执行速度。循环展开时需要注意的是展开的次数(即展开因子)应该适量,过大会导致代码膨胀、缓存未命中率增加等问题,影响性能。 循环展开通常需要配合编译命令中的优化选项一起使用,以便在编译时对代码进行优…

    C 2023年5月23日
    00
  • OpenCV基于距离变换和分水岭实现图像分割

    OpenCV基于距离变换和分水岭实现图像分割 1. 距离变换 距离变换是将一副灰度图像中的每个非零像素点赋予一个基于其与最近零像素距离的新值的操作。距离变换常被用于形态学图像处理中的对象筛选,但也可以被用于图像分割中。 在OpenCV中,可以通过cv2.distanceTransform函数实现距离变换。其中第一个参数是输入的二值化图像,第二个参数是距离类型…

    C 2023年5月22日
    00
  • 蒲公英x4c路由器怎么样 蒲公英x4c路由器详细评测

    蒲公英x4c路由器怎么样 蒲公英x4c路由器详细评测 蒲公英x4c路由器概述 蒲公英x4c路由器是一款基于OpenWRT固件开发的智能高速路由器,具有高速稳定、易于管理、安全稳定等特点。它采用了千兆网口,堡垒机级别的安全保障系统和智能家居和NAS多功能集成等设计,支持数据加速、加密、压缩等多项技术,既符合个人用户的需求,也符合企业用户的需求。 蒲公英x4c路…

    C 2023年5月23日
    00
  • Rust处理错误的实现方法

    当我们在编写 Rust 代码时,不可避免地会遇到错误。Rust 的错误处理机制允许我们有效地处理和跟踪错误,以确保程序稳定的运行。 在 Rust 中,错误通常被表示为实现了 std::error::Error trait 的结构体。这个 trait 定义了两个方法,description() 和 cause(),分别用于返回错误信息和错误原因。我们也可以通过…

    C 2023年5月23日
    00
  • Mybatis-plus操作json字段实战教程

    下面是“Mybatis-plus操作json字段实战教程”的完整攻略: 1. 引入依赖 要操作json字段,我们需要引入fastjson依赖,以及mybatis-plus本身的依赖。在这里我们使用mybatis-plus的最新版本3.4.3: <dependency> <groupId>com.alibaba</groupId&…

    C 2023年5月23日
    00
  • set_new_handler(0)有什么用

    set_new_handler是C++语言提供的一个函数,用于设置一个新的内存分配失败处理程序。当内存分配操作失败时,该处理程序将被调用。当我们在C++程序中使用new操作符申请内存时,如果系统找不到合适的内存块,就会触发内存分配失败,进而导致程序抛出std::bad_alloc异常。 set_new_handler(0)的作用是设置一个新的内存分配失败处理…

    C 2023年5月23日
    00
  • 实例分享cmake编译一个简单c++项目(demo)

    作为网站作者,我很乐意为大家详细讲解如何使用CMake编译一个简单的C++项目。在本文中,我将为您提供一些步骤,以帮助您了解如何使用CMake生成可执行文件、静态库或共享库。我们将会涉及以下几个方面: 概述 安装CMake 创建C++项目 编写CMakeLists.txt 配置并生成项目 示例说明 总结 1. 概述 CMake是一个跨平台的、开源的构建工具,…

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