c++ std::enable_shared_from_this作用

这篇具有很好参考价值的文章主要介绍了c++ std::enable_shared_from_this作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

enable_shared_from_this 是什么

std::enable_shared_from_this 是一个类模板,用来返回指向当前对象的shared_ptr智能指针。在说明它的作用前我们可以看一下如下代码:

demo.cpp

#include <memory>
#include <iostream>
     
class A
{
public:
    A() { std::cout << "A()" << std::endl; }
    ~A() { std::cout << "~A()" << std::endl; }

    std::shared_ptr<A> getSharedPtr()
    {
        std::shared_ptr<A> ptr(this);
         return ptr;
    }
};
     
int main()
{
    std::shared_ptr<A> ptr1(new A());
    std::shared_ptr<A> ptr2 = ptr1->getSharedPtr();
     
    return 0;
}

类 A 中有一个函数 getSharedPtr() 函数,用来返回指向当前对象的一个shared智能打针。其实就是用 this 构造了一个智能指针进行返回,执行结果如下:
c++ std::enable_shared_from_this作用
看着好像没什么问题,别着急,再看下一个例子:

class B
{
public:
    B() { 
        m_age = new int(10);
        std::cout << "B()" << std::endl; 
        
    }
    ~B() { 
        std::cout << "~B()" << std::endl; 
        if (m_age){
            delete m_age;
            m_age = nullptr;
        }
    }

    std::shared_ptr<B> getSharedPtr()
    {
        std::shared_ptr<B> ptr(this);
         return ptr;
    }
private:
    int* m_age;
};

int main()
{
    std::shared_ptr<B> ptr1(new B());
    std::shared_ptr<B> ptr2 = ptr1->getSharedPtr();
     
    std::cout << ptr1.use_count() << std::endl; // 输出引用计数
    std::cout << ptr2.use_count() << std::endl; // 输出引用计数
    return 0;
}

与类A不同的是,类B有一个在堆上创建的成员,我们再来看一下运行结果:
c++ std::enable_shared_from_this作用
可以看到程序再运行到最后时刻崩溃了,报错:free(): invalid pointer,free 了无效的指针。我们应该能看到是重复释放的问题,这里我们将裸指针赋给了智能指针,这样做潜在的危险就是对象被多次释放。

细心的小伙伴肯定看到了,智能指针ptr1 和 ptr2 的引用计数都是 1,在程序执行结束的时候都会释放一次资源,导致程序崩溃。enable_shread_from_this 的作用就是解决这个问题,示例代码如下:

class C: public std::enable_shared_from_this<C>
{
public:
    C() { 
        m_age = new int(10);
        std::cout << "C()" << std::endl; 
        
    }
    ~C() { 
        std::cout << "~C()" << std::endl; 
        if (m_age){
            delete m_age;
            m_age = nullptr;
        }
    }

    std::shared_ptr<C> getSharedPtr()
    {
        return shared_from_this();
    }
private:
    int* m_age;
};

int main()
{
    std::shared_ptr<C> ptr1(new C());
    std::shared_ptr<C> ptr2 = ptr1->getSharedPtr();
     
    std::cout << ptr1.use_count() << std::endl;
    std::cout << ptr2.use_count() << std::endl;
    return 0;
}

运行结果如下:
c++ std::enable_shared_from_this作用

可以看到,此时两个智能指针的引用计数都为2,这两个智能指针指向了相同的资源。在 main 函数退出后,两个智能指针依次释放,引用计数依次减一,直至为0,资源成功释放。

推荐一个零声学院免费教程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:文章来源地址https://www.toymoban.com/news/detail-422199.html

到了这里,关于c++ std::enable_shared_from_this作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++中using namespacr std;的作用

    在 C++ 中,using namespace std; 是一个常用的语句,它的作用是引入 std 命名空间中的所有成员到当前的命名空间中,这样在当前的作用域中就可以直接使用 std 命名空间中的所有成员,而不需要在每个标识符前加上 std:: 的前缀。 例如,在没有 using namespace std; 的情况下,要使用

    2024年02月16日
    浏览(32)
  • 【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针

    🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、类的作用域  二、类的实例化 三、类对象模型  四、this指针 1、this指针的引出  2 this指针的特性 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定

    2024年04月15日
    浏览(38)
  • 【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)

    欢迎各位小伙伴关注我的专栏,和我一起系统学习C++,共同探讨和进步哦! 学习专栏 : 《进击的C++》 C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象

    2024年02月03日
    浏览(35)
  • 使用Charles小贴士之报错(Notes SSL Proxying not enabled for this host: enable in Proxy Settings)

    (报错的总结持续更新,报错单独写这样好找一点) 报错1: SSL Proxying not enabled for this host: enable in Proxy Settings 昨天用还好好的,今天使用就报(Notes        SSL Proxying not enabled for this host: enable in Proxy Settings) 原因是:我手机wifi代理IP搞错了,在电脑的cmd找ip地址跟charles了的地

    2024年02月03日
    浏览(39)
  • 【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

    🔥 个人主页 : Forcible Bug Maker 🔥 专栏 : C++ 目录 前言 什么是面向对象? 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 最早的C++版本(C with classes)中,最先加上的就是类的机制,它构成了面向对象编程(OOP)的

    2024年04月14日
    浏览(40)
  • WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. I... it

    查看防火墙状态时,日志中有警告: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. I... it now.   解决: 在  firewalld  中添加了一个配置参数来禁用区域偏移 在以前的版本中, firewalld  服务包含一个未记录的行为,称为\\\"zone drifting\\\"。RHEL 7.8 删除了此行

    2024年02月15日
    浏览(36)
  • mysql:Error 3948 (42000): Loading local data is disabled; this must be enabled on both the client an

    上面图片是AI创作,未经允许,不可商用哦!如有更多需要,可私戳! 执行项目过程中意外出现的报错,之前也没有遇到过 报错信息如下: 翻译如下: 看报错信息感觉是和数据库有一定关系,网上搜索该错误,也都直指mysql中的一个参数: local_infile 需要指定该参数为开启状

    2024年02月02日
    浏览(29)
  • 对于LayoutInflater.from(this).inflate()方法的理解

    对于 LayoutInflater.from(this).inflate() 方法的几个参数以及用法总是迷迷糊糊,源码看了忘,忘了看,因此决定写这篇博客做下记录。 我们知道,调用LayoutInflater.from(this).inflate()方法最终都会走三参的方法 public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) ,这

    2024年02月13日
    浏览(31)
  • Scala中this的用法与作用

    在Scala中, this 是一个,用于引用当前类的对象。可以使用this访问类的成员,比如调用实例变量,方法,构造函数。 使用 this 与 点运算符(.) ,可以调用该类的数据成员。 this() 用于定义类的辅助构造函数。在创建辅助构造函数时,需要在第一行调用另一

    2024年02月13日
    浏览(53)
  • C# this关键字的作用

    在C#中, this 有以下几种主要作用: 引用当前对象: this  用于引用当前类的实例。可以通过  this  来访问当前对象的成员变量、方法和属性。 区分字段与局部变量:当成员变量和局部变量同名时,可以使用  this  来区分。 在构造函数中调用其他构造函

    2024年02月22日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包