博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库在工作(12)引用计数的智能指针intrusive_ptr
阅读量:4162 次
发布时间:2019-05-26

本文共 1745 字,大约阅读时间需要 5 分钟。

当我们在维护旧代码时,很多情况是身不由己的,想从头来开发,又需要时间过多,投入成本过多,老板当然不愿意。想继续使用旧的代码,又需要投入过多的维护成本。要想在这种情况下,提高代码的维护性,又减少出错,因而想引入智能指针管理。比如已经存在引用计数的对象时,如果再想使用智能指针shared_ptr来管理,显然达不目标了,那么怎么办呢?就这样放弃智能指针的使用吗?显然不行,有没有更好的方法呢?在boost库里,又提供了一个强大的智能指针intrusive_ptr来实现这样的功能。前面的智能指针shared_ptr是提供自己内部的引用计数,我们想修改它的引用计数方法是很困难的,也实现不了,而智能指针intrusive_ptr考虑到这种情况,很方便实现了。如下面的例子:
// boost_007.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include 
#include
//接口引用计数class IUnknown{ int m_lCountRef; public: IUnknown() : m_lCountRef(0) {} virtual ~IUnknown() {} unsigned long AddRef(void) { ++m_lCountRef; return m_lCountRef; } unsigned long Release(void) { if (--m_lCountRef==0) { delete this; } return m_lCountRef; } protected: IUnknown& operator=(const IUnknown&) { // 无操作 return *this; } private: // 禁止复制构造函数 IUnknown(const IUnknown&); };class com_class : public IUnknown {public: com_class() { std::cout << "com_class::com_class()\n"; } com_class(const com_class& other) { std::cout << "com_class(const com_class& other)\n"; } ~com_class() { std::cout << "com_class::~com_class()\n"; } //定义两个给intrusive_ptr调用函数 friend void intrusive_ptr_add_ref(IUnknown* p) { p->AddRef(); } friend void intrusive_ptr_release(IUnknown* p) { p->Release(); } };int _tmain(int argc, _TCHAR* argv[]){ //测试使用。 std::cout << "Before start of scope\n"; { boost::intrusive_ptr
p1(new com_class()); boost::intrusive_ptr
p2(p1); } std::cout << "After end of scope \n"; system("PAUSE"); return 0;}
在这个例子里,类
IUnknown
就是一个旧代码已经声明的引用计数,然后在派生类
com_class
里实现对引用计数进行增加或减少,就可以使用智能指针
intrusive_ptr
来管理了。

转载地址:http://vaixi.baihongyu.com/

你可能感兴趣的文章
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
Mysql复制表以及复制数据库
查看>>
如何使用 systemd 中的定时器
查看>>
linux进程监控和自动重启的简单实现
查看>>
深入理解HashMap
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>