C++11新特性之——enable_shared_from_this(Boost原有)

C++ Boost库安装配置与核心组件实战指南 C++标准库为开发者提供了基础功能支持,但在实际工程中常面临功能缺失或跨平台兼容性问题。Boost库作为C++标准库的扩展与试验田,通过提供高质量、经过同行评审的组件填补了这些空白。其设计遵循现代C++理念,采用泛型编程和模板元编程技术,显著提升了代码复用性和可维护性。在技术价值层面,Boost不仅解决了字符串处理、文件系统操作、并发编程等常见痛点,更成为许多C++新标准特性的孵化器,如智能指针、正则表达式等均源自Boost。对于C++开发者而言,掌握Boost意味着能够更高效地处理跨平台路径操作、实现类型 阅读详情

       enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为:

template< class T > class enable_shared_from_this;
       std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, ... ) ,它们与 pt 共享对象 t 的所有权。
       若一个类 T 继承 std::enable_shared_from_this<T> ,则会为该类 T 提供成员函数: shared_from_this 。 当 T 类型对象 t 被一个为名为 pt 的 std::shared_ptr<T> 类对象管理时,调用 T::shared_from_this 成员函数,将会返回一个新的 std::shared_ptr<T> 对象,它与 pt 共享 t 的所有权。


一.使用场合

       当类A被share_ptr管理,且在类A的成员函数里需要把当前类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr。
        1.为何不直接传递this指针

       使用智能指针的初衷就是为了方便资源管理,如果在某些地方使用智能指针,某些地方使用原始指针,很容易破坏智能指针的语义,从而产生各种错误。

        2.可以直接传递share_ptr<this>么?

       答案是不能,因为这样会造成2个非共享的share_ptr指向同一个对象,未增加引用计数导对象被析构两次。例如:

#include <memory>
#include <iostream>
 
class Bad
{
public:
	std::shared_ptr<Bad> getptr() {
		return std::shared_ptr<Bad>(this);
	}
	~Bad() { std::cout << "Bad::~Bad() called" << std::endl; }
};
 
int main()
{
	// 错误的示例,每个shared_ptr都认为自己是对象仅有的所有者
	std::shared_ptr<Bad> bp1(new Bad());
	std::shared_ptr<Bad> bp2 = bp1->getptr();
	// 打印bp1和bp2的引用计数
	std::cout << "bp1.use_count() = " << bp1.use_count() << std::endl;
	std::cout << "bp2.use_count() = " << bp2.use_count() << std::endl;
}  // Bad 对象将会被删除两次

输出结果如下:

 当然,一个对象被删除两次会导致崩溃。

正确的实现如下: 

#include <memory>
#include <iostream>
 
struct Good : std::enable_shared_from_this<Good> // 注意:继承
{
public:
    std::shared_ptr<Good> getptr() {
        return shared_from_this();
    }
    ~Good() { std::cout << "Good::~Good() called" << std::endl; }
};
 
int main()
{
    // 大括号用于限制作用域,这样智能指针就能在system("pause")之前析构
    {
        std::shared_ptr<Good> gp1(new Good());
        std::shared_ptr<Good> gp2 = gp1->getptr();
        // 打印gp1和gp2的引用计数
        std::cout << "gp1.use_count() = " << gp1.use_count() << std::endl;
        std::cout << "gp2.use_count() = " << gp2.use_count() << std::endl;
    }
    system("pause");
} 

输出结果如下:

二.为何会出现这种使用场合 

       因为在异步调用中,存在一个保活机制,异步函数执行的时间点我们是无法确定的,然而异步函数可能会使用到异步调用之前就存在的变量。为了保证该变量在异步函数执期间一直有效,我们可以传递一个指向自身的share_ptr给异步函数,这样在异步函数执行期间share_ptr所管理的对象就不会析构,所使用的变量也会一直有效了(保活)。

具体的应用可以参考:Boost.Asio C++ 网络编程之五:TCP回显服务端/客户端

C++ Boost库全面指南:从核心工具到网络编程实战 在C++开发中,第三方库是扩展标准库功能、提升开发效率的关键。Boost库作为C++社区的“准标准库”,其设计遵循RAII(资源获取即初始化)等核心编程范式,通过智能指针等组件实现了安全的资源管理。从技术价值看,Boost不仅提供了大量高质量、跨平台的组件,更是C++新特性的试验田,许多功能如智能指针、正则表达式、文件系统等均率先在此实现并最终被纳入C++11/17/20标准。在实际应用场景中,无论是处理网络通信、并发编程,还是解析命令行参数、管理复杂数据结构,Boost都能提供优雅的解决方案。本文聚焦于B 阅读详情

相关推荐

C++11核心特性解析:右值引用、智能指针与并发编程实战

在C++编程中,资源管理和并发编程是提升代码性能与安全性的关键。传统C++依赖手动内存管理和平台特定的多线程API,容易引发内存泄漏和数据竞争等问题。C++11通过引入右值引用与移动语义,实现了高效的资源转移,避免了不必要的深拷贝开销。智能指针(如unique_ptr、shared_ptr)基于RAII机制,自动管理内存生命周期,显著提升了代码的健壮性。标准线程库(std::thread、std::mutex、std::atomic)提供了可移植的并发编程支持,简化了多线程开发。这些特性共同构成了现代C++

weixin_34198881的博客 397

关于boost中enable_shared_from_this类的原理分析 --转载

首先要说明的一个问题是:如何安全地将this指针返回给调用者。一般来说,我们不能直接将this指针返回。想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变量并不知道,此时如果外部变量使用这个指针,就会使得程序崩溃。 使用智能指针shared_ptr看起来是个不错的解决方法。但问题是如何去使用它呢?我们来看如下代码: #include <...

weixin_37910058的博客 382

现代C++实战指南:从RAII到协程,掌握核心范式与工程实践

C++作为一门高性能系统编程语言,其核心价值在于对硬件资源的精细控制和零开销抽象。通过RAII(Resource Acquisition Is Initialization)机制,现代C++实现了资源管理的自动化,将资源生命周期与对象绑定,从根本上解决了内存泄漏和异常安全问题。这一原理催生了智能指针、移动语义等关键技术,使得开发者能够编写出既安全又高效的代码。在工程实践中,这些特性与标准库组件(如容器、算法、并发工具)结合,广泛应用于高性能计算、游戏引擎、嵌入式系统等场景。本文聚焦于现代C++的实战应用,深

weixin_34295316的博客 379

c++11 智能指针-辅助类 (std::enable_shared_from_this)

std::enable_shared_from_this 能让其一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, ... ) ,它们与 pt 共享对象 t 的所有权。

qq_40788199的博客 2040

使用boost::enable_shared_from_this的示例程序

Boost是一个流行的C++库集合,提供了许多有用的功能和工具。其中之一是boost::enable_shared_from_this,它是一个模板类,用于在C++中管理共享指针的生命周期。正如我们所看到的,通过使用boost::enable_shared_from_this,我们可以在类成员函数中获取有效的共享指针,从而实现自引用的功能。在这个例子中,我们定义了一个名为MyClass的类,并通过public继承boost::enable_shared_from_this来为该类启用自引用能力。

2301_79326891的博客 263

游戏开发实战:5种AOI算法对比(九宫格 vs 灯塔 vs 十字链表)

本文深入对比了游戏开发中五种主流AOI算法(九宫格、灯塔、十字链表等)的性能与适用场景,帮助开发者根据项目规模选择最优解决方案。通过详细的技术分析和实战数据,揭示不同算法在万人同屏等极端场景下的表现差异,为MMORPG等大型多人在线游戏提供关键性能优化指南。

weixin_29268385的博客 474

C++ 中 enable_shared_from_this 的使用总结

C++ 中 enable_shared_from_this 的使用总结

编程猿来如此 2195

STM32MP157+AD7606BSTZ四通道IEPE传感器采集方案实战(附完整电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器采集方案,涵盖硬件电路设计、软件驱动开发及系统性能优化。通过精确的恒流源设计和同步采样技术,实现高精度振动信号采集,适用于工业振动监测等应用场景。

weixin_42713608的博客 700

2016-11-02: boost::enable_shared_from_this

2016-11-02: boost::enable_shared_from_this 使用场景 当类对象被shared_ptr管理时,需要在类自己定义的函数中把当前对象作为参数传递给其他函数时,必须传递一个shared_ptr,否则就不能保持shared_p...

dianli2014的专栏 220

RGB接口电容触摸屏驱动(一)模块介绍

RGB接口电容触摸屏驱动(一)模块介绍

杰克拉力船长个人博客 7872

机器学习ROC曲线中的阈值thresholds

在ROC曲线上的不同点对应于不同的阈值。根据任务的具体要求,可以选择合适的阈值,以达到平衡召回率和误报率,或者根据具体应用场景调整模型的工作点。,表示样本属于正例的概率。这个概率值可以被截断为二元分类的决策,通过选择一个阈值来决定样本是被分类为正例还是负例。通过改变阈值,可以得到不同的真正例率(TPR)和假正例率(FPR),从而绘制出ROC曲线。总体来说,ROC曲线提供了模型在不同阈值下的性能综合情况,帮助分析模型的分类能力。通常来说,随着阈值的增加,TPR会减小,而FPR会增加。ROC曲线的绘制涉及。

行子的博客 3653

C++11新特性之十:enable_shared_from_this

 enable_shared_from_this是一个模板类,定义于头文件&lt;memory&gt;,其原型为: template&lt;class T&gt; class enable_shared_from_this; std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额...

750

高级Salesforce开发面试题

自定义设置允许您创建自定义数据集,以及为组织、配置文件或特定用户创建和关联自定义数据。自定义元数据类似于自定义设置,但是自定义元数据类型中的记录被视为元数据而不是数据。自定义设置有列表和层次自定义设置两种。自定义元数据中没有此类类型。此外,自定义元数据不支持基于用户配置文件或特定用户的层次结构类型的数据。自定义设置现在不再支持关系字段。但您可以在自定义元数据对象之间创建查找。元数据查询不占用查询sql次数的限制。

weixin_45663522的博客 1237

C++对象池-多线程工厂模式

C++对象池 文章目录C++对象池对象池含义需要的组件enable_shared_from_this类boost::noncopyable类weak_ptr智能指针弱回调要注意的问题代码 对象池含义 假设有Stock类,代表一只股票的价格,每一只股票有一个唯一的字符串表示。Stock是个主动对象,他不断获取新的价格。那么为了节省资源,同一个程序同一只股票应该只出现一次,如果股票没有被用到那么应该被...

weixin_44048823的博客 1110

PX4实战(四):PX4 uorb模块详解

本节主要讲解PX4中的uorb消息,主要包括uorb的基本概念使用、PX4内重要的uorb消息、如何自定义uorb消息以及使用uorb消息的注意点等,其中讲解重要uorb消息是为了对PX4内重要数据结构有初步的了解,有助于后期算法理解。uORB(micro Object Request Broker)是PX4中用于模块间通信的轻量级发布-订阅(Publish/Subscribe)机制。模块之间可以通过uORB传递消息,无需直接调用对方函数;提高系统模块化与解耦性;

PX4-SLAM-PNC 1928

【雕爷学编程】Arduino智慧农业之温湿度数据上传到云平台

它们可能有错误、不适用或者无法编译。在实施过程中,需要注意传感器的选择和校准、通信和网络稳定性、数据隐私和安全保护、电源管理以及数据分析和决策支持等方面的事项。数据分析和决策支持:上传到云平台的温湿度数据可以提供丰富的信息,但需要合适的数据分析和决策支持工具来帮助农业业主理解和利用这些数据。您可以根据自己的需求和喜好选择适合您的云平台和库,并根据您的具体硬件配置进行适当的修改和调整。将温湿度数据上传到云平台,农业业主可以实时监测粮库内的温湿度情况,及时采取通风、除湿等措施,确保粮食质量和长期储存的稳定性。

雕爷学编程 1275

终极指南:高效构建Boost C++库的Android完整移植方案

在Android原生开发领域,C++性能优化一直是开发者面临的核心挑战。Boost for Android项目为这一挑战提供了专业解决方案,将业界领先的Boost C++库完整移植到Android平台。这个工具集支持从1.45.0到1.91.0的30多个Boost版本,覆盖了从早期NDK r4到最新NDK r27的所有Android工具链,为移动端C++开发提供了强大的基础设施支持。无论是网络编程

gitblog_00902的博客 251

ICC2: 如何让CTS指定pin多长指定长度

这里create_clock不需要写到sdc里,在脚本里写就行,需要注意的是脚本里存在remove_clock_tree的话,add_buffer就要放remove_clock_tree后面,或者给guide buffer设don't touch也行。跟innovus的操作逻辑一样,如果要让tree上的某一点长长,要先考虑这个点后面的clock tree能正常balance。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?-5意味着长长5ns,相反正值意味着做短。

m0_61544122的博客 679

C++11模板编程新特性:从外部模板到可变参数模板的全面解析

泛型编程是现代编程语言实现代码复用的核心技术,其核心原理是通过参数化类型实现算法与数据结构的解耦。在C++中,模板是实现泛型编程的基础机制,其技术价值在于能够在编译期生成类型安全的特化代码,从而提升运行时效率。这一特性在构建高性能库、实现通用容器和算法时尤为重要,广泛应用于游戏开发、金融系统、科学计算等对性能要求极高的场景。C++11标准对模板系统进行了系统性增强,其中外部模板通过显式实例化声明优化了大型项目的编译性能,可变参数模板则彻底解决了处理任意数量类型参数的难题,使得std::tuple、std::

weixin_34408717的博客 356

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

现代C++设计模式实践:从原理到工程应用

设计模式是解决软件设计中常见问题的经典方案,其核心在于通过封装变化、降低耦合来提升代码的可维护性和可扩展性。在C++开发中,随着项目规模增长,代码的复杂度管理成为关键挑战。现代C++标准(C++11/14/17)引入了智能指针、lambda表达式、移动语义等特性,为设计模式的实现带来了新的可能。例如,利用std::unique_ptr可以安全地管理对象生命周期,避免内存泄漏;结合std::function和lambda,可以简化策略模式、命令模式的实现,减少类的数量。这些技术不仅让代码更简洁高效,也使得设计

weixin_34341229的博客 558

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

现代C++实战指南:从智能指针到并发编程的工程化应用

C++作为高性能计算和系统编程的核心语言,其现代特性(C++11及之后版本)通过引入RAII(资源获取即初始化)等核心编程范式,从根本上解决了传统C++中资源泄漏和内存管理的难题。这一原理通过智能指针(如std::unique_ptr和std::shared_ptr)实现,将资源生命周期与对象绑定,极大提升了代码的安全性与可维护性。其技术价值在于提供了零成本抽象,允许开发者编写既高效又安全的代码。在工程实践中,这些特性广泛应用于大型项目、游戏引擎和嵌入式AI等场景,例如通过移动语义优化性能,利用Lambda

weixin_30755393的博客 447

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++11四大核心特性:lambda、bind、function与可变模板协同实战

C++11引入的lambda表达式、std::bind、std::function和可变参数模板,共同构成了现代C++工程化落地的底层支柱。它们分别解决即兴逻辑封装、参数预设、类型擦除与泛型复用等关键问题,其协同机制远超语法糖范畴——lambda生成闭包对象实现零开销抽象,std::bind依赖可变模板支持任意参数绑定,std::function通过小对象优化平衡性能与灵活性。在风控系统、异步任务、日志库等高频场景中,合理组合这四大特性可显著降低内存泄漏率、提升编译效率并保障线程安全。本文聚焦生产级实践,解

weixin_34075268的博客 475

C++11三大核心特性:类重构、可变参数模板与Lambda表达式

C++11标志着现代C++编程范式的真正起点,其核心价值在于将长期依赖宏、手工内存管理和胶水代码的开发模式,升格为语言原生支持的工程化能力。从资源管理角度看,移动语义与RAII(如unique_ptr)解决了C++03中深拷贝冗余、异常不安全和析构泄漏等类设计顽疾;从接口扩展维度,可变参数模板终结了N重函数重载的维护噩梦,实现类型安全、零运行时开销的泛型日志与格式化;而Lambda表达式则将回调逻辑内聚于调用点,结合捕获列表与std::function,彻底摆脱全局函数与仿函数的封装割裂。这些特性共同支撑起

weixin_30463341的博客 361

C++中高级面试题深度解析:从虚函数表到RAII与并发编程实战

C++作为一门支持面向对象、泛型和系统级编程的语言,其核心机制如虚函数表(vtable)和RAII(Resource Acquisition Is Initialization)是理解其对象模型和资源管理的基础。虚函数表通过运行时多态实现了动态绑定,而RAII则将资源生命周期与对象绑定,是避免内存泄漏和保证异常安全的关键。这些原理在现代C++工程实践中价值巨大,例如在实现高性能容器、设计线程安全组件和管理复杂资源时不可或缺。本文围绕C++中高级面试高频考点,深入剖析了**虚函数表机制**在多重继承下的工作原

weixin_34127717的博客 446

C++模板编程:从泛型基础到元编程实战

泛型编程是现代软件开发中实现代码复用的核心技术,它允许开发者编写与具体数据类型无关的通用算法和数据结构。其核心原理是通过参数化类型,在编译期生成针对特定类型的特化代码,从而实现类型安全的多态性。这一技术价值在于显著提升代码的复用率、减少冗余,并支持编译期计算与优化。在应用场景上,泛型编程广泛用于构建标准模板库(STL)中的容器(如vector、map)和算法,以及实现智能指针、元编程等高级特性。本文聚焦于C++模板机制,深入解析函数模板与类模板的实现,并探讨可变参数模板、模板特化等进阶主题,帮助开发者掌握这

weixin_34293059的博客 386

2024年C++面试指南:从内存管理到系统设计的高频考点解析

在软件工程领域,内存管理与并发编程是构建高性能、稳定系统的核心技术基础。内存管理涉及栈、堆的分配机制,以及内存泄漏的检测与防范,其原理直接关系到程序的效率与安全性。并发编程则通过锁、无锁数据结构及内存模型来确保多线程环境下的数据一致性与性能。这些技术的核心价值在于能够显著提升系统吞吐量、降低延迟,并有效利用多核硬件资源,因而在服务器开发、游戏引擎、嵌入式系统等高并发场景中至关重要。随着C++标准演进至C++20/23,现代C++特性如协程、概念与范围库进一步优化了异步编程与泛型设计。本文聚焦于C++中高级工

weixin_33805992的博客 378
上一篇: HTTP协议简介
下一篇: HTTP1.0~2.0发展史
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值