已关闭
fix: 修复内存问题 #20
fix: 修复内存问题 #20
已关闭
myxuan475创建于 7月25日关闭于 13 天前
共 1 个文件变更+10-7
@@ -415,7 +415,7 @@ void sortVector(std::vector<std::string> &vec) { std::sort(vec.begin(), vec.end(
415 415 
416static MMKV *getInstance(const std::string &ID) {416static MMKV *getInstance(const std::string &ID) {
417 auto kv =417 auto kv =
418- std::find_if(mmkvInstances.begin(), mmkvInstances.end(), [&ID](MMKV *inst) { return inst->mmapID() == ID; });418+ std::find_if(mmkvInstances.begin(), mmkvInstances.end(), [&ID](MMKV *inst) { return inst != nullptr && inst->mmapID() == ID; });
419 if (kv == mmkvInstances.end()) {419 if (kv == mmkvInstances.end()) {
420 return nullptr;420 return nullptr;
421 }421 }
@@ -572,10 +572,11 @@ static napi_value setupMMKVInstance(napi_env env, napi_callback_info info) {
572 auto cryptKey = NValueToString(env, args[2], true);572 auto cryptKey = NValueToString(env, args[2], true);
573 auto path = NValueToString(env, args[3], true);573 auto path = NValueToString(env, args[3], true);
574 auto it =574 auto it =
575- find_if(mmkvInstances.begin(), mmkvInstances.end(), [&id](MMKV *inst) { return inst->mmapID() == id; });575+ find_if(mmkvInstances.begin(), mmkvInstances.end(), [&id](MMKV *inst) { return inst != nullptr && inst->mmapID() == id; });
576- if (it != mmkvInstances.end())576+ if (it != mmkvInstances.end()) {
577- 577+ (*it)->close();
578 mmkvInstances.erase(it);578 mmkvInstances.erase(it);
579+ }
579 MMKV *kv = nullptr;580 MMKV *kv = nullptr;
580 auto cryptKeyPtr = cryptKey.empty() ? nullptr : &cryptKey;581 auto cryptKeyPtr = cryptKey.empty() ? nullptr : &cryptKey;
581 auto rootPathPtr = path.empty() ? nullptr : &path;582 auto rootPathPtr = path.empty() ? nullptr : &path;
@@ -588,9 +589,11 @@ static napi_value setupMMKVInstance(napi_env env, napi_callback_info info) {
588 } catch (const std::exception &e) {589 } catch (const std::exception &e) {
589 std::cerr << "Caught exception: " << e.what() << std::endl;590 std::cerr << "Caught exception: " << e.what() << std::endl;
590 }591 }
591- mmkvInstances.push_back(kv);592+ if (kv) {
592- indexing_enabled[id] = NValueToBool(env, args[4]);593+ mmkvInstances.push_back(kv);
593- initIndexForId(id);594+ indexing_enabled[id] = NValueToBool(env, args[4]);
595+ initIndexForId(id);
596+ }
594 }597 }
595 598 
596 return BoolToNValue(env, true);599 return BoolToNValue(env, true);
cpf-manager
cpf-managercpf-manager7月25日

【AI-Review】【建议】【基础代码问题】【验证问题】setupMMKVInstance 创建失败时返回值不准确

● 问题:setupMMKVInstance 函数在 MMKV 实例创建失败(kv 为 null)时,仍然返回 true。触发路径:当 MMKV::mmkvWithID() 抛出异常(被第590行 try-catch 捕获后 kv 保持 null)或返回 null(如 g_instanceLock 未初始化时 MMKV/Core/MMKV_Android.cpp:141 返回 null)时,第592行的 if (kv) 守卫正确地阻止了将 null 指针加入 mmkvInstances,但函数最终执行到第599行 return BoolToNValue(env, true) 仍返回 true。JS 侧会认为 setup 成功,后续对该 ID 的操作(getStringMMKV、setStringMMKV 等)调用 getInstance(id) 返回 null 后静默返回 undefined,导致用户数据未持久化而不知情。

● 影响:建议。当 MMKV 实例创建失败时,JS 侧无法感知失败,可能导致用户数据丢失且无任何错误提示。

● 建议:将返回值改为反映实际创建结果。可在 if (!id.empty()) 块前声明 bool result = false;,在 if (kv) 块内设置 result = true;,最终返回 BoolToNValue(env, result);。这样 JS 侧能正确感知 setup 是否成功,便于进行错误处理。

likedislike