[求助] 指针丢失,莫名的变成野指针了

项目是cocos2dx2.x写的一个网络棋牌游戏,上线有一段时间了,其中有几个比较棘手的问题。错误日志上显示一天偶尔出现两三次,不好测试。帮我分析下。




其中GameLayer里,在rengSaiZi这个函数里面,addChild(saiZi1);这行代码竟然会崩溃,想不明白,难道是this指针指向变了?




ItemLayer是Gamelayer的一个child。我创建的时候把parent也就是GameLayer这个指针传过去,但是有时候出现_game变成野指针了。最开始的时候我直接用
GameLaye* _game = (GameLayer*)getParent();
同样还是会时不时的出现野指针,很是无奈啊。
跪求解决。

调试功能是怎么弄的,我看你是在调试so库的出错文件,怎么弄:9:

是不是有remove的工作在action里?

没有啊 GameLayer是游戏的主Layer 这个没有action的 求助啊

加的腾讯的监控bug的sdk。 帮我看下是怎么回事。

贴出 ItemLayer::create()被调用的那段代码······

另外给个提示:网络线程里面不能有cocos2d的API哦····

你一步一步LOG上去,看看在哪里开变成野指针的···我猜测你的_game对象在你传参之前被回收了·····或者不小心被你修改了····或者传错参了·····3种情况

看见一天偶尔出现两三次多半是网络线程惹的祸了:14:

网络线程是不是独立线程,然后在接收数据创建对象,这时候2dx刚好运行到回收对象那里,等于创建了就马上回收,然后 就变野指针了

解决方法就是加锁啦

谢谢你的回复。
网络部分,我是通过主线程读取消息队列,然后再在主线程里操作cocos2d的API的。
自己测试的时候很难重现,不是很频繁的,都是用户bug日志上传看到的,如果要打log还要再更新客户端,那些log都是在更新客户端的时候打上的,定位到那一部分了。
一个场景scene里面GameLayer也就是_game是这个scene的child,然后其他layer都在_game里面。按道理来讲如果场景scene还在,_game就不会丢啊。
你说的这三个情况:_game对象在你传参之前被回收了·····或者不小心被你修改了····或者传错参了。
我在其它的层也有传_game指针也有出现过这种情况,之前我是没有传_game的,在子Layer里面game都是通过getParent()方式获取的,也会出现野指针,就是因为看见有这种情况的发生创建的时候传递指针_game。现在还是出现这种问题。

谢谢你的回复。
出现这个野指针的的确都是在网络消息到的时候调用_game出现的。
网络库是拿别人的改过来的。
给你说下我们的网络模型。看下有没有什么问题。

高级模式不能@。帮忙看下。

水平有限,没有草图很难看懂你的代码···只能意淫一下

你在2那个阶段的时候对MessageManager进行了一次锁···然后在3主线程 那里进行读的时候出现了异常对吗?

再不行就自己retain()那个Layer()····试试看···不要让自动内存池去管理

恩,基本上就是你画的那个图,是在读的时候出现的异常。
其中GameLayer是场景的主child,只要场景还在,按道理是不会被释放掉的啊。
我是觉得为什么_game会变成野指针,甚至getParent()获取的也是野指针。

_game变成野指针,getParent()获取的也是野指针·····这两种做法在本质上没有多大区别,具体得去看自动回收池源码···官方文档是这样解释的,对象会在父节点的消息循环解释后背自动回收······所以我建议你retain()GameLayer的父节点······看看还会不会这样···

你retain()GameLayer的父节点。GameLayer的父节点就是scene啊。

到哪里才unlock?

不要在锁里面做这么多操作试试

只是读取消息

读完之后马上unlock

然后在unlock后面再processData

另外你在update里面直接判断curLayer指针

看看这个指针有没有正确赋值

会不会变野指针

千万不要在网络线程New/Create Node等。

MyLock这个是局部变量 这个类的析构函数里面锁都去掉了啊
curLayer 怎么判断有没有正确赋值呢

谢谢你的回复。
网络消息是在主线程读取的,在主线程create的啊。
上面的网络模型是不是有哪个地方不妥啊