今天来立马改了测试代码,在父类里加上析构函数声明、实现……果然,析构后对象首地址的内容被改写了
Obj* pB = new Obj();
printf("addr(%d) \n", *((int*)pB));
delete pB;
printf("addr(%d) \n", *((int*)pB));
至此,可以肯定服务器宕机,就是因为战斗对象被析构,虚指针被改写为指向父类虚表,业务层再拿来用时就跪了。
(因为用到内存池,所以没出现悬垂指针的问题)
剩下的就好查了,delete对象时某业务模块仍持有其指针,没清理。搜搜战斗对象的引用关系,几分钟便找到问题所在。
战斗城池里有个守卫列表,npc进入时会把自己指针放入这个列表,死亡时没去清。
别人再来打这个城池时,跑战斗流程就调了纯虚函数,宕机。
类析构掉的话,虚表会被改写成iobj的虚表,析构过的指针,可以调iobj的虚函数,调其它虚函数则会挂
https://www.cnblogs.com/Pony279/archive/2013/06/04/3117955.html