c++模块间传递参数的一些经验教训

最近在开发一套新产品,测试中发现了一些UI奔溃,自己在设计模块通讯接口方面考虑不周全,在此做一下记录。
需求:
两个模块,UI调度模块以及实际功能模块。UI调度模块需要调用功能模块,获取数据,显示在UI上面。

//
之前的做法:
1.在功能模块,数据放在一个全局的list或者vector中,导出list或vector指针,供UI调度模块使用。
2.UI调度模块,提供一个全局指针用于存放传递过来的数据.
导致的问题:
UI调度模块频繁调度功能模块,功能模块里面的数据,增加或者删除,调度模块存放的数据就会乱,这样就会导致访问越界等问题,程序奔溃。
归根到底,还是数据的同步问题没有做好。
//

//
现在的做法:
1.list或者vector内存的申请以及释放,统一由UI调度模块提供。功能模块只填充数据,接口里提供UI调用模块list或者vector的指针即可。
2.UI调度模块,在所有增加或删除数据的地方,加锁。
这样再怎么重复调用,怎么刷新都不会异常了
//

//@2017.7.26
继续跟新,这样调用在相同的编辑器下,是可以的。但是如果功能模块使用vs2017开发的,ui调度模块使用的vs2010,就会导致堆栈异常。

终极解决方案:
不使用list或者vector传参,改为数组指针即可,内部用list或者vector实现。
分析:
list或者vector,都是模板,不同的编译器,内部实现应该有所差距。比如vs2010对C11支持的不是很好,智能指针,std::thread,数组的默认构造,都不支持。

扩展:
设计导出接口时,不使用模板类,比如string、cstring、vector、list等等,使用基本类型,比如wchar_t*,数组指针等等,这样兼容性更好。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值