已关闭
fix: 修复内存问题 #20
myxuan475创建于 7月25日关闭于 13 天前
fix: 修复内存问题 #20
已关闭
共 1 个文件变更+10-7
| @@ -415,7 +415,7 @@ void sortVector(std::vector<std::string> &vec) { std::sort(vec.begin(), vec.end( | |||
| 415 | 415 | ||
| 416 | static MMKV *getInstance(const std::string &ID) { | 416 | static 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); |
【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 是否成功,便于进行错误处理。