恒生UFX接口引用计数心得
本文介绍在基于恒生T2SDK基础上开发对接UFX柜台时,有关引用计数的一些心得体会。
下面以配置接口和连接接口为例子来介绍,下面是文档介绍:
创建配置接口说明:
3.1.2 创建配置接口(NewConfig)
函数原型:
CConfigInterface* FUNCTION_CALL_MODE NewConfig();
输入参数:
参数名称 参数说明 用法
无
返回:
新的连接配置项接口。
用法说明:
通过返回的新的连接配置项接口,设置相应的连接属性,具体的接口说明参照下面的CConfigInterface接口说明。
注意
NewConfig()返回的接口,必须调用AddRef,否则调用Release接口就无法释放
创建连接接口说明:
3.1.3 创建连接接口(NewConnection)
函数原型:
CConnectionInterface* FUNCTION_CALL_MODE NewConnection(CConfigInterface *lpConfig);
输入参数:
参数名称 参数说明 用法
CConfigInterface *lpConfig 配置对象,通过NewConfig()返回 输入参数
返回:
新的连接接口,所有发包收包都是建立在连接接口之上。
用法说明:
通过返回的连接接口指针,就可以访问服务端,发功能号,收应答,所有操作都是基于连接。
注意
NewConnection ()返回的接口,必须调用AddRef,否则调用Release接口就无法释放
文档指出,在使用NewXX类返回的指针时,必须调用AddRef,在不需要使用时,调用Release来释放引用计数。看到这里,心里就有一个疑问,在调用CConnectionInterface* pConnect = NewConnection(lpConfig)
时,lpConfig
的引用计数会增加吗?如果此时增加,那么什么时候释放呢?
原理分析
引用计数往往和一块申请好的内存相互关联,在这块内存被申请者申请后(此处是NewConfig,引用计数为1),传递给其他模块使用(此处为NewConnection的入参)时,需要由其他模块对这块内存维护引用计数。从这个角度出发,NewConnection
操作会增加传入指针的引用计数,而对应的Release
操作,会减少传入指针的引用计数。
实践验证
由于T2SDK
提供的dll未附带调试信息,因此,采用内存对比法来验证调用Release
函数时,是否真的释放内存。为了突出重点,此处只选用NewConfig
和NewConooection
这两个函数来验证。
- 第一步
CConfigInterface * lpConfig = NewConfig(); // 创建配置接口
lpConfig->AddRef();
//lpConfig->AddRef();
lpConfig->Release();
//lpConfig->Release();
方法:观察 lpConfig
所指向的内存有效性来验证释放内存有效性。
结论:AddRef和Release要一对一调用才能正确释放内存,两次AddRef对应一次Release,内存不会释放,一次AddRef对应两次Release,会触发异常。
- 第二步
CConfigInterface * lpConfig = NewConfig(); // 创建配置接口
lpConfig->AddRef();
CConnectionInterface* lpConnect = NewConnection(lpConfig); // 创建连接接口
lpConnect->AddRef();
// 类型1
lpConfig->Release();
lpConfig->Release(); // 调用此句,内存释放,说明 NewConnection 内部在创建成功的情况下,会对入参增加引用计数
// 类型2
lpConnect->Release();
lpConfig->Release();
lpConfig->Release(); // 调用到此处会崩溃,说明调用 lpConnect->Release() 时,会对之前的入参减少引用计数
// 类型3
lpConnect->Release();
lpConnect = NULL;
lpConfig->Release(); // 能够正常释放内存
lpConfig = NULL; // 防止后续代码误用
小结,NewConnection
函数以及其他New类型函数,对传入的NewXXX
类型入参会增加引用计数,调用Release
函数时,会减少对应的引用计数。从语义上来说,调用Release
表明当前模块不再关心该内存内容,以防后续业务代码误用,最好将对应指针置为空。
如果是NewXXX
返回的句柄在后续业务中需要继续使用,那么将此对象保存为成员函数对象,在整个生命周期中都维持有效,直到最终退出时,再释放对应内存。
恒生UFX接口引用计数心得的更多相关文章
- 恒生UFX交易接口基本介绍说明
1.恒生UFT和UFX有什么区别? UFT是一个极速交易系统,UFX是一个统一接入系统.交易系统很显然是可以进行股票交易的,UFX是所有后台交易系统的接入系统,不管后台是什么样子的交易系统都是可以通过 ...
- 恒生UFX交易接口基本介绍
https://zhidao.baidu.com/question/203296047903136445.html 1.恒生UFT和UFX有什么区别? UFT是一个极速交易系统,UFX是一个统一接入系 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...
- COM编程之四 引用计数
[1]客户为什么不应直接控制组件的生命期? 假设一个组件A正在使用另一个组件B,可想组件A(客户)代码中肯定有若干个指向组件B接口的指针. 那么这种情况下,当使用完一个接口而仍然在使用另一个接口时,是 ...
- ARC————自动引用计数
一.内存管理/引用计数 1.引用计数式内存管理的方式(下面四种) 对象操作 OC方法 生成并持有对象 alloc/new/copy/mutableCopyd等方法 持有对象 retain方法 释放对象 ...
- cocos2d-x 从onEnter、onExit、 引用计数 谈内存泄露问题
/////////////////////////////////// //author : zhxfl //date : 2013.8.29 //email : 291221622@qq.co ...
- Netty中ByteBuf的引用计数线程安全的实现原理
原文链接 Netty中ByteBuf的引用计数线程安全的实现原理 代码仓库地址 ByteBuf 实现了ReferenceCounted 接口,实现了引用计数接口,该接口的retain(int) 方法为 ...
- 【Netty官方文档翻译】引用计数对象(reference counted objects)
知乎有关于引用计数和垃圾回收GC两种方式的详细讲解 https://www.zhihu.com/question/21539353 原文出处:http://netty.io/wiki/referenc ...
随机推荐
- Code signing is required for product type 'Application' in SDK 'iOS 11.4'
查看链接: https://blog.csdn.net/Fantasy_Jun/article/details/78082359 处理方法: 将code signing identity设置为iOS ...
- js 操作数组
数组的增删 数组的尾部插入一个元素 var nums = [0,1,2,3,4]; nums.push(5,6,6); //[0,1,2,3,4,5,6,6] 删除数组尾部的元素 var nums = ...
- PAT Basic 1004
1004 成绩排名 (20 分) 读入 n(>0)名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 ...
- 基于ELK5.1(ElasticSearch, Logstash, Kibana)的一次整合
前言开源实时日志分析ELK平台(ElasticSearch, Logstash, Kibana组成),能很方便的帮我们收集日志,进行集中化的管理,并且能很方便的进行日志的统计和检索,下面基于ELK的最 ...
- 小甲鱼python第二讲课后习题
0.什么是BIF BIF为内置函数,英语全称为Build-in-Function Python3用input()取代了Python2的raw_input(),接收用户输入 1.用课堂上小甲鱼教的方法数 ...
- JS_高程5.引用类型(1)Object类型
引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...
- aix 查看内存,CPU 配置信息
内存lsattr -El mem0cpu lsdev -C |grep procCPU的信息lsattr -El proc0 #bootinfo -r查看物理内存 使用命令# lsdev ...
- Brendan Gregg ----Linux Performance Tools NEWS
- 发现一个“佛系记账本”
因为这是一款微信小程序,张小龙大力推崇的"用完即走"完美地适合记账应用. 不用下载.不用安装.不用注册.不用各种授权,只要从微信进入,就能记账,账本只与微信关联. 换手机.换PAD ...
- WIN10系统提示无法使用内置管理员账户打开XXX应用程序怎么办
重装了系统之后,只保留Administrator账户,结果打开程序的时候回弹出这个提示 运行,输入secpol.msc 本地策略-安全选项,启用下面这个,然后重启计算机