C++中智能指针(unique_ptr、shared_ptr、weak_ptr)详解

这篇具有很好参考价值的文章主要介绍了C++中智能指针(unique_ptr、shared_ptr、weak_ptr)详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++中的智能指针是一种 RAII(资源获取即初始化)机制的实现,它可以在对象不再需要时自动释放相关资源。智能指针通过封装指针对象并提供一些额外的功能,如引用计数、自动内存管理、避免内存泄漏等,使得指针使用更加安全和方便。

在C++中,有三种主要类型的智能指针:unique_ptrshared_ptrweak_ptr

unique_ptr

unique_ptr是一种独占式智能指针,它只能拥有唯一的对象,并且不能与其他的unique_ptr对象共享同一个对象。当unique_ptr离开作用域或被删除时,它所指向的对象也会自动被释放。

以下是一个使用unique_ptr的示例:

#include <memory>
#include <iostream>

int main() {
    // 创建一个unique_ptr指向一个int类型的对象
    std::unique_ptr<int> p(new int(42));
    
    // 使用unique_ptr指针
    std::cout << *p << std::endl;  // 输出42
    
    // unique_ptr离开作用域时自动释放所指向的对象
    return 0;
}

在这个例子中,unique_ptr指向一个int类型的对象,当unique_ptr离开作用域时,它所指向的对象也会自动被释放。

shared_ptr

shared_ptr是一种共享式智能指针,它可以被多个shared_ptr对象共享同一个对象。它内部维护了一个引用计数,当引用计数为0时,所指向的对象也会被释放。shared_ptr还提供了自定义删除器的功能,可以用于管理动态分配的内存和其它资源。

以下是一个使用shared_ptr的示例:

#include <memory>
#include <iostream>

int main() {
    // 创建一个shared_ptr指向一个int类型的对象
    std::shared_ptr<int> p1(new int(42));
    
    // 创建一个shared_ptr共享p1所指向的对象
    std::shared_ptr<int> p2 = p1;
    
    // 输出引用计数
    std::cout << "p1 use count: " << p1.use_count() << std::endl;  // 输出2
    std::cout << "p2 use count: " << p2.use_count() << std::endl;  // 输出2
    
    // p1和p2离开作用域时自动释放所指向的对象
    return 0;
}

在这个例子中,我们创建了两个shared_ptr指针,它们共享同一个int类型的对象,当这两个指针离开作用域时,它们所指向的对象也会自动被释放。

weak_ptr

weak_ptr是一种弱引用,它可以共享一个shared_ptr指针所指向的对象,但是它并不会增加该对象的引用计数,因此它不能直接使用该对象。weak_ptr可以用于解决shared_ptr`循环引用的问题。

以下是一个使用weak_ptr的示例:

#include <memory>
#include <iostream>

int main() {
    std::shared_ptr<int> p1(new int(42));
    std::weak_ptr<int> wp1 = p1;
    
    // 判断wp1所指向的对象是否已经被释放
    if (std::shared_ptr<int> p2 = wp1.lock()) {
        // 使用p2所指向的对象
        std::cout << *p2 << std::endl;  // 输出42
    }
    
    // p1离开作用域时自动释放所指向的对象
    return 0;
}

在这个例子中,我们创建了一个shared_ptr和一个weak_ptr,它们共享同一个int类型的对象。我们使用wp1.lock()获取shared_ptr指针p2,判断p2是否为空,如果不为空,则使用p2所指向的对象。

总结

智能指针是C++中管理动态内存的重要工具,它可以大大减少内存泄漏和悬挂指针等问题的发生。在使用智能指针时,我们需要注意一些细节,如避免循环引用、适当使用weak_ptr等。同时,智能指针并不是万能的,有些情况下我们还需要手动管理内存。文章来源地址https://www.toymoban.com/news/detail-410620.html

到了这里,关于C++中智能指针(unique_ptr、shared_ptr、weak_ptr)详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • shared_ptr和unique_ptr主动释放

    shared_ptr和unique_ptr均可以采用reset()来进行释放,unique_ptr调用了reset之后就会直接释放掉,shared_ptr则会在所有引用计数变为0的时候才会释放申请的内存。 注意unique_ptr的release()方法,并不会释放资源,只会把unique_ptr置为空指针,原来那个资源可以继续调用 reset 结果: 在reset之

    2024年02月14日
    浏览(28)
  • 【cmu15445c++入门】(8)C++ 智能指针unique_ptr

    智能指针是一种数据结构,用于没有内置内存管理的语言(例如 C++)中的内存管理(有时还有其他功能)。内置内存管理的语言的指的是具有垃圾回收功能的语言,如Java、Python。 现代C++标准库的两个智能指针(以及您将在类中使用的智能指针)是 std::unique_ptr 和 std::shared_

    2024年02月20日
    浏览(29)
  • C++智能指针shared_ptr详解

    C++智能指针shared_ptr是一种可以自动管理内存的智能指针,它是C++11新增的特性之一。与传统指针不同,shared_ptr可以自动释放所管理的动态分配对象的内存,并避免了手动释放内存的繁琐操作,从而减少了内存泄漏和野指针的出现。 shared_ptr是一个模板类,通过引用计数器实现

    2023年04月22日
    浏览(30)
  • C++智能指针shared_ptr用法

    写在前面的总结: 一个shared_ptr对象管理一个指针(new T,在堆空间),多个shared_ptr对象可以管理同一个指针,只有某个shared_ptr对象第一次初始化指针时才执行指针的构造函数,管理同一个指针的shared_ptr对象个数称为引用计数,这个引用计数保存在每个管理该指针的shared_p

    2024年02月03日
    浏览(46)
  • C++智能指针shared_ptr使用详解

    shared_ptr 是一个共享所有权的智能指针,允许多个指针指向同一个对象。 ​ shared_ptr 使用 引用计数 ,每一个shared_ptr的拷贝都指向相同的内存。每使用它一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,释放所指向的堆内存。shared_ptr内部的引用计数是安

    2024年02月07日
    浏览(34)
  • 【C++入门到精通】智能指针 auto_ptr、unique_ptr简介及C++模拟实现 [ C++入门 ]

    在 C++ 中,智能指针是一种非常重要的概念,它能够帮助我们自动管理动态分配的内存,避免出现内存泄漏等问题。在上一篇文章中,我们了解了智能指针的基本概念和原理, 本篇文章将继续介绍 auto_ptr 和 unique_ptr 两种智能指针的概念及其在 C++ 中的模拟实现 。通过学习这些

    2024年01月19日
    浏览(53)
  • 【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

    在 C++ 动态内存管理中,除了 auto_ptr 和 unique_ptr 之外,还有一种 智能指针 shared_ptr ,它可以让多个指针共享同一个动态资源,并且能够自动释放资源。 shared_ptr 通过引用计数的方式来管理内存,能够避免程序中出现悬空指针和内存泄漏等问题 。本文将介绍 shared_ptr 的简介和

    2024年01月22日
    浏览(38)
  • 智能指针shared_ptr

    shared_ptr共享它指向的对象,内部采用计数机制来实现。当新的shared_ptr与对象关联时,引用计数加1;当shared_ptr超出作用域时,引用计数减1;当引用计数为0时,释放该对象; shared_ptrA p0 = std::make_sharedA(\\\"西红柿\\\");//C++11提供 重载了*和-操作符,可以像使用指针一样使用shared_ptr

    2023年04月23日
    浏览(31)
  • C++11补充:智能指针如std::unique_ptr如何添加自定义的deleter

    关于智能指针的问题,有时候为了方便,需要在析构时附加一些清理操作,或者,有的指针本身来自C的库文件中,这时候,就非常期望能够使用自定义的deleter, 但是标准C++创建函数如std::make_unique / std::make_shared 等不支持创建带有自定义deleter的智能指针,这时,我们只能使用

    2024年02月07日
    浏览(32)
  • 深入理解和应用C++ std::shared_ptr别名构造函数

    在现代C++中,智能指针是一个极为重要的工具,尤其std::shared_ptr以其自动内存管理、引用计数和多线程安全性等特性深受开发者喜爱。其中一个不太常用但功能强大的构造方式是 别名构造函数 ,它允许我们创建一个共享相同底层对象但是指向其内部不同数据成员或子对象的

    2024年01月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包