本文介绍在基于恒生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函数时,是否真的释放内存。为了突出重点,此处只选用NewConfigNewConooection这两个函数来验证。

  • 第一步

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接口引用计数心得的更多相关文章

  1. 恒生UFX交易接口基本介绍说明

    1.恒生UFT和UFX有什么区别? UFT是一个极速交易系统,UFX是一个统一接入系统.交易系统很显然是可以进行股票交易的,UFX是所有后台交易系统的接入系统,不管后台是什么样子的交易系统都是可以通过 ...

  2. 恒生UFX交易接口基本介绍

    https://zhidao.baidu.com/question/203296047903136445.html 1.恒生UFT和UFX有什么区别? UFT是一个极速交易系统,UFX是一个统一接入系 ...

  3. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  4. C++ 引用计数技术及智能指针的简单实现

    一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...

  5. COM编程之四 引用计数

    [1]客户为什么不应直接控制组件的生命期? 假设一个组件A正在使用另一个组件B,可想组件A(客户)代码中肯定有若干个指向组件B接口的指针. 那么这种情况下,当使用完一个接口而仍然在使用另一个接口时,是 ...

  6. ARC————自动引用计数

    一.内存管理/引用计数 1.引用计数式内存管理的方式(下面四种) 对象操作 OC方法 生成并持有对象 alloc/new/copy/mutableCopyd等方法 持有对象 retain方法 释放对象 ...

  7. cocos2d-x 从onEnter、onExit、 引用计数 谈内存泄露问题

    /////////////////////////////////// //author : zhxfl //date   : 2013.8.29 //email  : 291221622@qq.co ...

  8. Netty中ByteBuf的引用计数线程安全的实现原理

    原文链接 Netty中ByteBuf的引用计数线程安全的实现原理 代码仓库地址 ByteBuf 实现了ReferenceCounted 接口,实现了引用计数接口,该接口的retain(int) 方法为 ...

  9. 【Netty官方文档翻译】引用计数对象(reference counted objects)

    知乎有关于引用计数和垃圾回收GC两种方式的详细讲解 https://www.zhihu.com/question/21539353 原文出处:http://netty.io/wiki/referenc ...

随机推荐

  1. phtnon 文件操作

    1.文件定义 (1).什么是文件? 文件是操作系统为用户或者应用程序提供一个读写硬盘的虚拟单位 文件的核心就是读写,即我们只需要对于进行读写操作,就是对操作系统发起请求,然后由操作系统将用户或者应用程 ...

  2. 关于git分支管理,推送拉取等等

    git推送本地分支到远程分支 场景 有时候我们开发需要开一个分支,这样可以有效的并行开发. 开分支有两种方式: 一种是在远程开好分支,本地直接拉下来; 一种是本地开好分支,推送到远程. 远程先开好分支 ...

  3. spring boot ${}占位符不起作用

    问题:在 pom.xml 文件里定义好属性标签,然后在 properties或者xml 中使用${key}引用,打包之后就会自动替换掉. 但是在使用 spring boot 后发现,@可以替换,但是$ ...

  4. leetcode笔记--水箱问题

    类型的引用:Solution *s=new Solution(); 1.Container With Most Water Given n non-negative integers a1, a2, ...

  5. mui 从列表进入到详情,再返回,列表页还是进入列表之前的样子,而不刷新页面

    mui 从列表进入到详情,再返回,列表页还是进入列表之前的样子,而不刷新页面

  6. @RequestBody, @ResponseBody 注解详解(转)

    原文地址: https://www.cnblogs.com/qq78292959/p/3760651.html @RequestBody, @ResponseBody 注解详解(转) 引言: 接上一篇 ...

  7. centos找不到环境变量 -bash: ls: command not found

    #在系统中输入命令,报如下错误: [root@a1 work]# ll-bash: ls: command not found #昨时解决办法:export PATH=/usr/local/sbin: ...

  8. EasyMock 简单使用

    参考案例:(本位使用markdown编写)https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/https://www.yii ...

  9. javascript 生成MD5加密

    进行HTTP网络通信的时候,调用API向服务器请求数据,有时为了防止API调用过程中被黑客恶意篡改,所请求参数需要进行MD5算法计算,得到摘要签名.服务端会根据请求参数,对签名进行验证,签名不合法的请 ...

  10. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...