关于动态库之间stl调用的问题
来源:互联网 发布:淘宝网店推广方案 编辑:程序博客网 时间:2024/04/30 12:29
最近在做cocos2dx的自更新,因为一开始没有选择用lua,所以现在不得不找其他出路来做自更新。
当然直接的想法就是把逻辑丢到一个动态库里面,框架部分加一个资源管理ok。然后问题就来了
一开始在4.4的android设备上测试,一切正常,但是拿到4.0.4的机器上就直接崩溃了,anrdoid调试起来很困难,弄了很久也没搞定,放弃。
第一个症状,初始化LabelAtlas时挂掉,挂的很尴尬,看不出理由的(至少当时是这样),看着好像内存被写乱了,但是怎么也查不到。
然后瞎折腾了半天,居然找到了一个解决方法。因为是在LabelAtlas写本地字符缓冲m_sString时导致的崩溃,弄了很多方法,最后在UICCLabelAtlas加了一个函数修改m_sString,在setProperty之前调用这个函数先写入传来的字符串。崩溃没了(原因至今不明)。
然后继续玩下
二号问题来了。登陆部分做了账号密码缓存,这个东西用到了CCUserDefault,实际上这个东西在win32下跟android上的实现完全不同。结果是,如果玩家第一次进入,也就是没有账号密码缓存的时候,返回的数据一旦被操作就会导致内存错误,产生段错误而崩溃。这个问题也仅存在于4.0.4的设备上(其他低版本设备没测试过)。
最后说重点,问题产生的原因,与解决方法。
原因是就是标题说的,stl对象跨动态库传递导致。stl全都是基于模板的,模板是在编译器生成的。这也就是说同一份stl代码在不同动态库中有各自的实现,如果只是方法多了一份自然就没问题,但是部分stl容器里面存有一些静态变量,因此多个实现会导致多份静态变量,然后导致某些方法的调用出现差别,最终导致内存操作异常而崩溃(这个原因是网上查的,这些是我大概的理解原链接)。
LabelAtlas里面有一个UICCLabelAtlas对象。而UICCLabelAtlas继承自CCAtlasNode,CCAtlasNode则是cocos2dx库中的东西,cocos2dx被我编译成了一个独立的so文件,LabelAtlas则在libextension.so中。m_sString成员变量是在CCAtlasNode中定义的,因此UICCLabelAtlas的存在导致了m_sString被两个so中的stl实现所操作,然后崩溃。
CCUserDefault是cocos2dx的实现,我的逻辑代码则在逻辑动态库中,而取值函数getStringForKey的返回参数则是一个std::string,同样造成了一个对象被两套方法处理导致混乱崩溃。
更正一下,貌似我这个问题应该解释成:
"在DLL中使用STL对象std::string,并且在其中改变std::string的内容,即发生了内存的重分配问题,若在EXE中调用该函数会出现内存访问问题。"因为DLL和EXE的内存分配方式不同,DLL中的分配的内存不能在EXE中正确释放掉"
引自:http://www.cnblogs.com/gisattic/archive/2005/04/28/146805.html
PS:cocos2dx版本2.2.2,这种问题在win32,android4.2+,ios模拟器7.0+都没有出现过,另外第一个问题的奇怪解法也让我看不懂,有知情者请留言交流
- 关于动态库之间stl调用的问题
- 最好不要在C++动态库与调用着之间传递STL模版
- 动态库动态调用WEbservice的问题!
- STL 中Map容器的跨动态库调用
- 关于STL/ATL/WTL之间的区别
- 关于STL/ATL/WTL之间的区别
- 动态库中,关于全局变量的调用
- 关于不同类之间句柄调用问题
- 关于struts2.5.5action动态方法调用的问题
- [转]关于C与C++中互相调用动态链接库的问题
- 一次软件工程作业:关于C与C++中互相调用动态链接库的问题
- 关于vs2010下编译dll动态库,JNA接口在java中调用的问题
- 关于32位和64位部署出现C#调用动态库DLL不成功的问题
- 关于java jni调用c++动态库的一些问题及解决方法
- 关于创建动态链接库和调用问题
- Java调用动态库的问题
- C++ linux 调用动态库的问题
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- equals 和 ==
- 给Apk瘦身
- Python学习笔记(四)Python对象
- iphone崩溃日志分析工具symbolicatecrash用法
- opengl编程指南笔记
- 关于动态库之间stl调用的问题
- 使用Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换
- 給Mac添加wget功能
- 个性化推荐的十大挑战
- Zed Shaw:程序员的常见健康问题
- Project facet Java version 1.7 is not supported.
- Linux 2.6 kernel 中的makefile 中文翻译
- 2014年9月11日我的csdn博客诞生-随遇而安
- Objective-C的内省(Introspection)小结