cocos3.17 有致命的崩溃,百分百必现。

由于想看内存泄漏的情况,就把CC_REF_LEAK_DETECTION宏打开了,然后产品也上线了,出现了一堆崩溃日志。

由于IOS用户本来是要退出app,退出app的要销毁数据,退出的这个过程中出现了崩溃,理论上不影响用户体验,因为用户本来就要退出,崩的这个过程用户感知不到。 但是buggly 会出现一堆崩溃数据,求一个好的解决方案。
必须要改c++的代码,然后重新提交包,才能解决这个问题吗,在线等

最简单的helloworld也会崩溃。
cocos2dx 3.17 lua 创建hellowrold工程。
修改CCRef.h文件中的CC_REF_LEAK_DETECTION 宏定义改为1
xcode编译调试,程序启动后,杀死进程,就会崩溃。 百分百必现。

#define CC_REF_LEAK_DETECTION 1
开启这个在异步/多线程中创建Ref添加进__refAllocationList容器会出问题,使用Ref::printLeaks()等也容易崩溃
而游戏免不了用多线程,所以引擎自带的这功能基本无法使用,需要修改下,
我是通过给__refAllocationList添加锁实现,大概代码如下

   #include <mutex>        
   std::mutex __mutext
    __mutext.lock();
    __refAllocationList.push_back(ref);
    __mutext.unlock();
    __mutext.lock();
        auto iter = std::find(__refAllocationList.begin(), __refAllocationList.end(), ref);
        if (iter == __refAllocationList.end())
        {
            log("[memory] CORRUPTION: Attempting to free (%s) with invalid ref tracking record.\n", typeid(*ref).name());
    		__mutext.unlock();
            return;
        }
        __refAllocationList.erase(iter);
    	__mutext.unlock();