来北京一星期了,大体上过得还算不错,公司的环境正是我想要的,可以从九天身上学到很多东西.主要任务是想办法把猎鸟移到android上, 一直有bug 都是在调用free 删除对象的时候 而linux windows以及ios上都没有错.很奇怪 纠结了好几天.最后发现问题在std::string上.那个经典的跨module(exe、动态库)间申请/释放内存违例的问题. 查找这个问题时真的很费时,也不容易想到.
在android上一般我们建立三个动态库 cocos2d cocosdenshion和游戏主体逻辑的动态库。一般情况下所有精灵和action都是由cocos2dx库建立,删除也由cocos2dx库删除(通过调用release()).
但是我们的游戏中为了优化使用了对象分配池,很多对象都是在游戏主体的那个动态库中分配的.
对于包含string对象的一些类如CCLabelAtlas, 分配时,把string和string内部所指向的char*字符串建立在游戏主体的动态库地址空间中,而当在cocos2dx库中删除它时,stl库会检查该char*是不是该动态库中的地址空间 这里显然不是,所以crash了.
我的解决方法是把cocos2dx编译成一个静态库,然后和游戏主体一起打包成一个动态库,这样他们的地址空间就是一样的了.
windows上可以开启多线程dll方式 将参与合作的module统统以链入crt库,使他们在同一个地址空间中, gcc这边应该也有
但我对gcc这方面的配置可能还不是很熟,或许通过gcc的配置可以解决这个问题,希望熟悉的网友给个解答吧.