游戏在android下切换场景时崩了,查看崩溃日志发现是在Unit对象析构时发生了SEGV_MAPERR,仔细研究了一番,发现是在访问一个指针成员时出错,这个指针指向的内存已经被释放了。
但是为什么只在android下崩,win和ios都没出现呢,然后调试win下的代码,发现在win下根本没走到这一行代码来,在前面有一行检测另一个vector成员size是否大于0,大于0才会继续往下走,在android下是大于0的。
继续研究发现这个vector成员(非指针)已经先自动析构了,只是在win下和anroid下STL实现的析构行为不一样,android下不会清0,谜题终于解开。
通过这次事件才注意到c++的非指针成员自动析构是有顺序的,后声明的先析构,那么后析构的成员就不应该在析构时去访问已经先于自己析构的其他成员。设计时要尽量避免成员之间的依赖。