shared_ptr:弱回调技术

本文探讨了如何利用shared_ptr和weak_ptr管理对象生命周期,特别是在公司员工信息查询和管理场景中。通过定制shared_ptr的删除器,结合弱引用回调,确保离职员工信息的有效清理,同时利用enable_shared_from_this解决对象生命周期问题。文章通过代码示例展示了智能指针在防止内存泄漏和实现弱回调中的关键作用。
摘要由CSDN通过智能技术生成

           场景:公司company存有公司员工的信息,现在给定一个查询接口,给定员工姓名在公司中查找若找到返回员工信息,若没有找到在公司录入这个员工信息。

     1 若简单在公司company中用一个容器保存staff信息,那么staff离职了需要清理容器否则staff信息一直存在。

     2 又涉及了对象生命周期的管理,想到shared_ptr/weak_ptr,那么company用weak_ptr管理员工对象,即容器存放weak_ptr,给定员工姓名找到相应的weak_ptr尝试提升这个weak_ptr,若提升成功则表明公司有这个员工,否则需要录入这个员工。这样即使员工离职了,公司只保存了一个weak_ptr对象。但是这还是存在内存泄露,毕竟离职的weak_ptr没用了。

      3 利用shared_ptr的订制析构功能:

            3.1 定制删除器:

 shared_ptr(Y *p, D d)的第一个参数是要被管理的指针,它的含义与其他构造函数的参数相同,而第二个删除器参数d则告诉shared_ptr在析构时不是使用delete在操作指针p,而要用d来操作,即把delete p 换成d(p);在这里删除器d可以是一个函数对象,也可以是一个函数指针,只要它能够像函数那样被调用,使得d(p)成立即可。对删除器的要求是它必须是可拷贝的,行为必须也像delete那样,不能抛出异常。有了删除器的概念,就可以用shared_ptr实现管理任意资源,只要这种资源提供了它自己的释放操作。

template<class Y,class D> shread_ptr::shared_ptr(Y* p,D d)

template<class Y,class D> shared_ptr::reset(Y* p,D d)//这里Y与shared_ptr本身的模板参数T可以不同,只要Y*能隐式转换为T*  //shared_ptr<T> x//x本身的模板参数T

           3.2 利用shared_ptr的订制析构功能,传入一个仿生函数或函数指针d在析构时不用delete而用d。结合2,weak_ptr提升为shared_ptr后若没有提升成功,则新建员工信息并用shared_ptr订制析构功能注册个回调函数d作为删除器,这个删除器不再简单的delete对象而是再执行一个将公司容器中相应的weak_ptr删除,这样解决了2的内存泄露问题

           3.3 3.2company中创建员工信息时,订制析构器是利用boost

该错误通常出现在尝试在一个const类型的ros消息指针上调用getMessage()函数时。由于该指针是const的,因此不能对其进行修改,而getMessage()函数是用于修改消息的非const函数,因此编译器会报错。 解决这个问题的方法是,使用boost::const_pointer_cast函数将const类型的指针转换为非const类型指针。具体步骤如下: 1. 在你的C++代码中包含以下头文件: ``` #include <ros/ros.h> #include <ros/console.h> #include <rosgraph_msgs/Log.h> #include <boost/shared_ptr.hpp> #include <boost/const_pointer_cast.hpp> ``` 2. 然后,创建一个ros::Subscriber对象来订阅rosout节点: ``` ros::Subscriber sub = nh.subscribe("/rosout", 1000, &callback); ``` 其中,"/rosout"是要订阅的rosout节点的话题名称,1000是消息队列的大小,callback是当接收到消息时要调用的回调函数。 3. 在回调函数中,将const类型的指针转换为非const类型指针,然后再使用getMessage()函数: ``` void callback(const boost::shared_ptr<const rosgraph_msgs::Log>& msg) { boost::shared_ptr<rosgraph_msgs::Log> nonconst_msg = boost::const_pointer_cast<rosgraph_msgs::Log>(msg); std::string message = nonconst_msg->getMessage(); ROS_INFO_STREAM("Message: " << message); } ``` 这样,你就可以在C++代码中使用getMessage()函数获取订阅的消息了。注意,使用const_pointer_cast函数进行类型转换时要非常小心,避免意外修改const指针所指向的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值