本文介绍在基于恒生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. centos7下安装配置redis

    1.1. Redis下载安装(linux) 1.1.1. 下载: 下载地址:https://redis.io/download 选择合适的版本下载,如下图: 1.1.2. 安装: (1)把下载好的re ...

  2. Seaborn入门

    Seaborn入门 Seaborn是基于matplotlib的python数据可视化库,提供更高层次的API封装,使用起来更加方便快捷. displot displot()集成了hist直方图和kde ...

  3. 线段树模板hdu 1166:敌兵布阵

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. Network Monitoring in Software-Defined Networking :A Review(综述)

    来源:IEEE SYSTEMS JOURNAL 发表时间:2018 类型:综述 主要内容:概述了SDN监控的发展,并从收集信息.预处理.传送信息.分析.和描述五个阶段进行解读,并比较了传统网络和SDN ...

  5. JSP(2)—绝对路径与相对路径、配置Servlet与Servlet注解

    一.绝对路径和相对路径 ①开发时建议使用据对路径,使用绝对路径肯定没有问题,但是用相对路径可能会有问题. 在由Servlet转发到JSP页面时,此时在浏览器地址栏显示Sevvlet路径,若JSP页面的 ...

  6. javascript——10章 DOM

    1.节点关系 (1)childNodes:返回节点的子节点集合 返回值:NodeList 对象,表示节点集合. 注:childNodes只能取到子级,不能取到子级的子级. childNodes所有节点 ...

  7. Spring Boot 之httpClient使用

    版权声明:本文为博主原创文章,转载时请在文章最前方附上本文地址. https://blog.csdn.net/qq_35033270/article/details/80112085 超文本传输协议( ...

  8. python下的selenium和PhantomJS

    一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览 ...

  9. VUE温习:style层次分析

    一.vue样式style层次分析 1.样式可以在main.js.模块js文件.组件style.组件script标签内,index.html文件内引入,不同位置引入的样式有什么关系. 2.总结: (1) ...

  10. iOS scrollsToTop属性失效

    点击状态栏返回顶部失效,是因为scrollView的scrollsToTop属性失效 (继承于scrollView的tableView collectionView也算). 这个属性默认是开启的,然而 ...