客户端Crash一般原因小结
客户端Crash的原因是很多的,也是开发中最不希望发生的问题,那我先总结一下我遇到Crash的情况以及解决办法。
1、最常见的问题是野指针的问题。
野指针是指当内存已经释放之后又去调用原来指向该内存的指针,这时由于内存已经释放掉了,所以再次访问时就会发生Crash。
解决的办法:
当然最好的办法就是写代码的时候能够时刻注意内存的分配与释放,同时在对象被释放之后将其指针置空。但是即使是高手中的高手也会因为疏漏出现内存释放之后重新引用的情况,特别是像我这样的新手,更是容易出现这样的问题了。所以我们的希望只能寄托在编译器身上了。我用的是VS2012,当程序Crash之后,我们应该做的是查看堆栈,上面提示的是crash的地方,我们根据堆栈的提示一步步找到指针释放后又被引用的地方,然后对其进行调整,要么不要简单释放,要么将其引用计数加一。对于堆栈的查看我们需要了解的是堆栈提示方式,在堆栈的最上方是由断言或degub引起的,这一般不能给与我们很明确的提示,我们继续往下看,这里面提示的也是引擎的相关库函数,对于库函数一般是不会出问题的,所以我们应该查看的是出现我们自己代码的地方,这时我们点击进入到我们的代码中,查看挂的地方,在这一块仔细分析一下逻辑,找出Crash的原因并改正过来。
2、资源找不到的情况
我们在Resources目录中存放我们所需的图片、声音等资源文件,所以当crash后堆栈提示找不到资源文件时我们应该首先在Resources文件中查看该文件是否存在,使用的是大图的话要看是否打图成功;确定资源是存在之后我们再来看一下工程属性中的工作路径,查看是否加入Resources的路径,例如(../Resources),加入资源路径。如果是将资源路径写成了字符串放在专门的类中进行集中管理,我们需要确认字符串替换的正确性,以及使用资源的地方是否包含了该资源类的头文件。
3、内存泄漏的问题
内存泄漏是指在内存使用之后没有释放的导致内存不能重新分配使用的现象。我们知道栈中的内存也是系统自动回收的,这个我们不需要考虑自己管理内存泄露的问题,而堆区的释放一定要注意使用完后手动释放,不然就会出现内存泄露的问题。在小的程序中我们可能感受不到这个问题的严重性,在成品软件中我们必须要严防这个问题,很多时候在PC端开发的时候没有感觉到任何问题,但是版本发布后就会发现出现很多Crash,这个其中很重要的原因就是因为内存泄露。我们经常说手机内存的大小,当手机装了一大堆软件之后就会变得非常卡,就是这个原因,内存泄露之后正在运行的程序越来越感觉内存不够用,严重的就是不断卡顿然后Crash。所以要养成习惯,注意内存使用与回收的问题。
解决的办法就是使用Cocos2d-x自带的内存管理机制,将对象加入到内存自动管理池中,然后在确认不使用之后及时的delete掉他,使内存能够重新分配使用。