恒生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 ...
随机推荐
- 【Luogu3381】【模板】缩点
本文同步发表于https://www.zybuluo.com/Gary-Ying/note/1235385 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最 ...
- 逻辑回归与神经网络还有Softmax regression的关系与区别
本文讨论的关键词:Logistic Regression(逻辑回归).Neural Networks(神经网络) 之前在学习LR和NN的时候,一直对它们独立学习思考,就简单当做是机器学习中的两个不同的 ...
- javascript——10章 DOM
1.节点关系 (1)childNodes:返回节点的子节点集合 返回值:NodeList 对象,表示节点集合. 注:childNodes只能取到子级,不能取到子级的子级. childNodes所有节点 ...
- vue路由打开新窗口
一. <router-link>标签实现新窗口打开: 官方文档中说 v-link 指令被 <router-link> 组件指令替代,且 <router-link> ...
- 2017年50道Java线程面试题
下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...
- mysql 创建用户命令-grant
我们在使用mysql的过程中,经常需要对用户授权(添加,修改,删除),在mysql当中有三种方式实现 分别是 INSERT USER表的方法.CREATE USER的方法.GRANT的方法.今天主要看 ...
- 挖矿病毒 qW3xT.2 最终解决方案
转自:https://blog.csdn.net/hgx13467479678/article/details/82347473 1,cpu 100%, 用top 查看cpu100 2,删掉此进程 c ...
- nltk 的分词器punkt: ssl问题无法下载
报错: LookupError: ********************************************************************** Resource pu ...
- golang基础学习及web框架
golang的web框架 web框架百花齐放:对比 Go Web 编程 Go Web Examples Golang 适合做 Web 开发吗? beego beego简介 go-restful gol ...
- 单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...