当前位置:首页 > 科技  > 软件

探秘C++标准模板库中的三种智能指针

来源: 责编: 时间:2024-01-24 17:27:42 329观看
导读在C++标准模板库(STL)中有三种智能指针:shared_ptr、unique_ptr和weak_ptr。这三者在现代C++编程中扮演着至关重要的角色,它们的设计旨在管理动态内存,并提供更安全、更方便的内存管理方式。shared_ptr:共享的智能指针share

在C++标准模板库(STL)中有三种智能指针:shared_ptr、unique_ptr和weak_ptr。这三者在现代C++编程中扮演着至关重要的角色,它们的设计旨在管理动态内存,并提供更安全、更方便的内存管理方式。FnS28资讯网——每日最新资讯28at.com

FnS28资讯网——每日最新资讯28at.com

shared_ptr:共享的智能指针

shared_ptr是一种具有引用计数功能的智能指针。当多个shared_ptr指向同一块内存时,它们会维护一个引用计数,确保在没有任何指针指向该内存时自动释放。下面是一个简单的示例:FnS28资讯网——每日最新资讯28at.com

#include <memory>#include <iostream>int main() {    std::shared_ptr<int> shared1 = std::make_shared<int>(42);    std::shared_ptr<int> shared2 = shared1; // 共享所有权    std::cout << "shared1: " << *shared1 << std::endl; // 输出:42    std::cout << "shared2: " << *shared2 << std::endl; // 输出:42    // 引用计数减一,但不会释放内存,因为仍然有一个shared_ptr指向它    shared1.reset();    std::cout << "shared2: " << *shared2 << std::endl; // 输出:42    // 当最后一个shared_ptr离开作用域时,引用计数为零,内存被释放    return 0;}

shared_ptr的优势在于其能够方便地共享所有权,但同时也容易造成循环引用,因为它们只有在引用计数归零时才会释放内存。这时就引出了我们接下来要介绍的weak_ptr。FnS28资讯网——每日最新资讯28at.com

weak_ptr:破除shared_ptr的循环引用

weak_ptr是一种不增加引用计数的智能指针,通常用于打破shared_ptr的循环引用。weak_ptr允许你观察到由shared_ptr管理的对象,但不拥有它。让我们看一个例子:FnS28资讯网——每日最新资讯28at.com

#include <memory>#include <iostream>struct Node {    std::shared_ptr<Node> next;};int main() {    std::shared_ptr<Node> node1 = std::make_shared<Node>();    std::shared_ptr<Node> node2 = std::make_shared<Node>();    node1->next = node2;    node2->next = node1; // 引入循环引用    // 使用weak_ptr打破循环引用    std::weak_ptr<Node> weakNode1 = node1;    std::weak_ptr<Node> weakNode2 = node2;    // 输出:2 2,因为循环引用被打破,引用计数不再增加    std::cout << "node1 references: " << node1.use_count() << std::endl;    std::cout << "node2 references: " << node2.use_count() << std::endl;    return 0;}

weak_ptr的一个重要特性是,通过lock()函数可以将其转换为一个shared_ptr,以便安全地访问所指向的对象。在使用weak_ptr时要注意,由于它不增加引用计数,所以在使用前需要检查对象是否仍然存在。FnS28资讯网——每日最新资讯28at.com

unique_ptr:独占所有权的智能指针

unique_ptr是一种独占所有权的智能指针,它确保在任何时候只有一个unique_ptr可以指向给定的对象。当unique_ptr离开作用域时,它所管理的对象会被自动释放。让我们看一个例子:FnS28资讯网——每日最新资讯28at.com

#include <memory>#include <iostream>int main() {    std::unique_ptr<int> unique1 = std::make_unique<int>(42);    // 编译错误,因为unique1独占了对内存的所有权    // std::unique_ptr<int> unique2 = unique1;   std::cout << "unique1: " << *unique1 << std::endl; // 输出:42    // unique1离开作用域,内存被释放    return 0;}

unique_ptr的优势在于它避免了共享所有权可能引发的循环引用问题,并允许更加高效的内存管理。然而,由于其独占性质,unique_ptr不适用于所有场景,特别是在需要多个指针共享同一块内存的情况下。FnS28资讯网——每日最新资讯28at.com

总结:三者的联系与区别

在使用这三种智能指针时,我们需要根据具体的需求来选择合适的类型。下面是它们的联系和区别的简要总结:所有权管理:FnS28资讯网——每日最新资讯28at.com

  • shared_ptr:共享所有权,可以由多个shared_ptr共同管理同一块内存。
  • unique_ptr:独占所有权,确保在任何时候只有一个unique_ptr可以指向给定的对象。
  • weak_ptr:不增加引用计数,用于解决shared_ptr可能引发的循环引用问题。

循环引用处理:FnS28资讯网——每日最新资讯28at.com

  • shared_ptr:容易形成循环引用,需要小心管理。
  • unique_ptr:不涉及循环引用问题,因为它是独占所有权的。
  • weak_ptr:用于打破shared_ptr的循环引用,但需要小心使用,确保在访问前检查对象是否仍然存在。

性能开销:FnS28资讯网——每日最新资讯28at.com

  • shared_ptr:引用计数的维护可能带来额外的性能开销。
  • unique_ptr:更加轻量,没有引用计数,性能开销较小。
  • weak_ptr:相对于shared_ptr来说,性能开销较小。

在实际应用中,我们可以根据具体场景的需要,选择合适的智能指针类型,以获得更好的内存管理和性能表现。FnS28资讯网——每日最新资讯28at.com

结语

在本次的C++探秘中,我们深入了解了shared_ptr、unique_ptr和weak_ptr这三种智能指针。它们分别适用于不同的场景,为我们提供了更安全、更灵活的内存管理方式。在实际编程中,熟练掌握这些智能指针的用法,将有助于提高代码的可维护性和安全性。FnS28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-67344-0.html探秘C++标准模板库中的三种智能指针

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 在Django中自定义字段,你需要知道的所有知识点!

下一篇: 一文读懂C++如何实现多返回值

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
Top