本文介绍在基于恒生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返回的句柄在后续业务中需要继续使用,那么将此对象保存为成员函数对象,在整个生命周期中都维持有效,直到最终退出时,再释放对应内存。

转载于:https://www.cnblogs.com/cherishui/p/10429970.html

恒生UFX接口引用计数心得相关推荐

  1. 恒生股票交易接口api主要作用在哪里?

    恒生股票交易接口api在股票市场中占有举足轻重的地位,同时也是各上市公司股价走势的重要指标. 股票交易接口api是一种能够实时查看各类股票行情的软件接口,它能够广泛地应用于多种行业.不同的领域,具有广 ...

  2. 在Windows,Mac,Linux中快速安装配置Node.js环境,并安装VSCode, 完成Web端恒生交易日接口的图形化展示...

    编程课应该怎么制作? 编程的乐趣应来自实用主义,我大学本科第一门Java编程课,几乎劝退了所有同学,因为那些教学代码不实用且无趣,一点图形化的内容都没有,而实用的编程课应早早展现图形化的成果, 于是我 ...

  3. 使用SWIG封装恒生极速UFT接口(Python3)

    使用SWIG封装恒生极速UFT接口(Python3) 一.准备工作 参考资料 CTP Python API及Demo(利用Swig 封装)Windows版(traderapi),20191208,作者 ...

  4. 恒生股票数据接口可以实现更加方便地实时获取上海和深圳市场行情数据吗?

    我们已经针对 Level2 实时行情数据,开发了能够对接恒生 NSQ 极速行情系统的插件.有了它,用户可以更加方便地实时获取上海和深圳市场行情数据啦!该插件目前已经支持的数据源包括: 现货逐笔委托行情 ...

  5. 测试AVFrame的空间分配和引用计数接口

    AVFrame 结构体分析 AVFrame 相关函数 AVFrame 引用计数 测试代码 Test_AVFrame.cpp #include <iostream>using namespa ...

  6. 【牛客】恒生公司2015秋招开发类笔试题

    恒生公司2015秋招开发类笔试题(一) 关于windows的消息机制的描述: 只有当一个线程调用Win32 API中的GDI(Graphics Device Interface)和User函数时,操作 ...

  7. JVM——引用计数算法与可达性分析算法

    前几篇博客我们一起认识了JVM的内存模型(程序计数器.虚拟机栈.本地方法栈.方法区与堆),了解了它们的内存结构与分配,同时也略带提到关于内存的回收. JVM--内存模型(一):程序计数器 JVM--内 ...

  8. Java引用计数与实现

    引用计数(Reference Counting)可作为内存管理办法,也是老代jvm垃圾回收策略之一,原理简单但是仍有广泛的引用,如OkHttp,netty等. 回收原理 对象在创建实例的时候会在堆内存 ...

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

    /// //author : zhxfl //date   : 2013.8.29 //email  : 291221622@qq.com //Adress : http://www.cnblogs. ...

  10. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

最新文章

  1. Hadoop配置环境变量
  2. 补充spring事务传播性没有考虑的几种情况
  3. Javascript 实现TreeView
  4. fastreport调用frf文件直接打印_来吧~~ 这里提供自助打印~
  5. 【SpringBoot MQ 系列】RabbitListener 消费基本使用姿势介绍
  6. Java - 线程安全的 HashMap 实现方法及原理
  7. Git分布式版本管理
  8. 如果把Python代码写成这样子就太难看了
  9. 语音识别的两个方法_语音识别的应用有哪些
  10. CloudStack核心类ApiServlet、ApiServer、ApiDispatcher、GenericDaoBase源码分析
  11. 原创 | 职场风云 (三)面对压力
  12. 9款最新炫酷HTML5/CSS3应用推荐
  13. 零基础数据挖掘入门-二手车价格预测part(一):EDA-数据探索性分析
  14. 华为手机连接电脑,无法使用USB调试或者无USB连接弹窗的问题
  15. Elementui Tooltip 修改背景色和箭头颜色
  16. harmonyos下载,harmonyos 2.0下载
  17. mysql将没有员工的部门都删除_Mysql 用sql语句实现删除与CLARK同部门的员工信息...
  18. RK3399平台开发系列讲解(IIO子系统)4.42、IIO子系统数据结构
  19. 【知识点】单片机USB转TTL模块的相关知识
  20. 1药网母公司路演PPT曝光:发行区间14到16美元 中旬上市

热门文章

  1. 工作占用了太多私人时间_当公司老板过多占用你的个人时间,虽然不是什么大事但很想辞职怎么办?...
  2. 使用函数求余弦函数的近似值
  3. 小米微信双开开启谷歌服务器,小米10怎么双开微信 具体设置方法分享
  4. java学习之Swing篇(一)——QQ登录界面
  5. 痴情人, 浮生梦(上)
  6. C++ Reference: Standard C++ Library reference: C Library: cfenv: FE_INEXACT
  7. 引入element组件插件
  8. shopee虾皮跨境电商怎么样,虾皮跨境电商的优势和劣势
  9. 坚果云Outlook邮件管理体系畅享高效办公生活
  10. MongoDB聚合操作MongoDB常用聚合管道聚合$project$match$count$group$unwind$limit$skip$sort$lookup用法及操作案例