testView::~testView()
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "testView::~testView");
- ClearAll();
+ // ClearAll();
g_pSystemView = nullptr;
}
void testView::ClearAll()
{
- if (group)
- {
+ // 1. 释放group和关联的SystemScrollView[TESTVIEW]
+ if (group) {
group->RemoveAll();
delete group;
group = nullptr;
- if (SystemScrollView[TESTVIEW])
- {
- SystemScrollView[TESTVIEW]->RemoveAll();
- delete SystemScrollView[TESTVIEW];
- SystemScrollView[TESTVIEW] = nullptr;
- delete SystemLabel;
- SystemLabel = nullptr;
- int funcSize = sizeof(Test_ViewMapper_t) / sizeof(Test_ViewMapper_t[TESTVIEW]);
- for (int i = 0; i < funcSize; i++)
- {
- if (button[i])
- {
+ }
+
+ // 2. 释放SystemScrollView[TESTVIEW](独立分支,避免依赖group)
+ if (SystemScrollView[TESTVIEW]) {
+ SystemScrollView[TESTVIEW]->RemoveAll();
+ delete SystemScrollView[TESTVIEW];
+ SystemScrollView[TESTVIEW] = nullptr;
+ }
+
+ // 3. 释放SystemLabel(独立判空,避免内存泄漏)
+ if (SystemLabel) {
+ delete SystemLabel;
+ SystemLabel = nullptr;
+ }
+
+ // 4. 释放button数组(独立释放,不依赖任何分支)
+ if (button != nullptr) { // 先检查数组本身是否有效
+ int funcSize = sizeof(Test_ViewMapper_t) / sizeof(Test_ViewMapper_t[TESTVIEW]);
+ // 防御性检查:避免funcSize为0或超出button数组长度
+ if (funcSize > 0 && funcSize <= 30) {
+ for (int i = 0; i < funcSize; i++) {
+ if (button[i]) {
delete button[i];
- button[i] = NULL;
+ button[i] = nullptr; // 统一用nullptr
}
}
}
}
- if (test_about_view)
- {
- delete test_about_view; // 1
+
+ // 5. 释放各类视图对象(按"从子到父"顺序,统一判空,规范写法)
+ if (test_about_view) {
+ delete test_about_view;
test_about_view = nullptr;
}
-
- if (test_LCD_view)
- {
- delete test_LCD_view; // 2
+ if (test_LCD_view) {
+ delete test_LCD_view;
test_LCD_view = nullptr;
}
- if (test_TP_view)
- {
- delete test_TP_view; // 3
+ if (test_TP_view) {
+ delete test_TP_view;
test_TP_view = nullptr;
}
- if (test_lum_view)
- {
- delete test_lum_view; // 4
+ if (test_lum_view) {
+ delete test_lum_view;
test_lum_view = nullptr;
}
- if (test_charging_view)
- {
- delete test_charging_view; // 5
+ if (test_charging_view) {
+ delete test_charging_view;
test_charging_view = nullptr;
}
- if (test_speak_view)
- {
- delete test_speak_view; // 6
+ if (test_speak_view) {
+ delete test_speak_view;
test_speak_view = nullptr;
}
- if (test_motor_view)
- {
- delete test_motor_view; // 7
+ if (test_motor_view) {
+ delete test_motor_view;
test_motor_view = nullptr;
}
-#ifdef SUPPORT_CAT1_SERVICE
- if (test_cat1_view)
- {
- delete test_cat1_view; // 8
+ #ifdef SUPPORT_CAT1_SERVICE
+ if (test_cat1_view) {
+ delete test_cat1_view;
test_cat1_view = nullptr;
}
-#endif
-
- if (test_KEY_view)
- {
- delete test_KEY_view; // 9
+ #endif
+ if (test_KEY_view) {
+ delete test_KEY_view;
test_KEY_view = nullptr;
}
- if (test_MG_view)
- {
- delete test_MG_view; // 10
+ if (test_MG_view) {
+ delete test_MG_view;
test_MG_view = nullptr;
}
- if (test_hr_view)
- {
- delete test_hr_view; // 11
+ if (test_hr_view) {
+ delete test_hr_view;
test_hr_view = nullptr;
}
- if (test_MP_view)
- {
- delete test_MP_view; // 12
+ if (test_MP_view) {
+ delete test_MP_view;
test_MP_view = nullptr;
}
- if (test_G_view)
- {
- delete test_G_view; // 13
+ if (test_G_view) {
+ delete test_G_view;
test_G_view = nullptr;
}
-#ifdef SUPPORT_A5133_SERVICE
- if (test_A5133_view)
- {
- delete test_A5133_view; // 13
+ #ifdef SUPPORT_A5133_SERVICE
+ if (test_A5133_view) {
+ delete test_A5133_view;
test_A5133_view = nullptr;
}
-#endif
- // delete test_G_view;//13
- // test_G_view= nullptr;
-
- for (int i = 1; i < 13; i++)
- {
- if (SystemScrollView[i])
- SystemScrollView[i] = nullptr;
- }
- if (test_Ping_view)
- {
- delete test_Ping_view; // PingTest
+ #endif
+ if (test_Ping_view) {
+ delete test_Ping_view;
test_Ping_view = nullptr;
}
- if (test_QRCode_view)
- {
- delete test_QRCode_view; // QRCode
+ if (test_QRCode_view) {
+ delete test_QRCode_view;
test_QRCode_view = nullptr;
}
-#ifdef SUPPORT_GNSS
- if (test_GPS_view)
- {
- delete test_GPS_view; // GPS
+ #ifdef SUPPORT_GNSS
+ if (test_GPS_view) {
+ delete test_GPS_view;
test_GPS_view = nullptr;
}
-#endif
+ #endif
+
+ // 6. 释放SystemScrollView数组其他元素(先释放内存,再置空)
+ if (SystemScrollView != nullptr) {
+ for (int i = 1; i < 30; i++) {
+ if (SystemScrollView[i]) {
+ SystemScrollView[i]->RemoveAll(); // 先清理内部资源
+ delete SystemScrollView[i]; // 释放内存
+ SystemScrollView[i] = nullptr; // 置空避免野指针
+ }
+ }
+ }
}
/// @brief 设置SystemScrollView
// 4.切换视图
void testView::ChangeView(int16_t hideView, int16_t showView)
{
- if (hideView > MAX_TESTVIEWID)
+ // 1. 修复:增加hideView下限检查(杜绝负数越界),同时检查showView合法性
+ if (hideView < 0 || hideView > MAX_TESTVIEWID)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView:: hideView(%d) Overstep ones bounds [0, %d]", hideView, MAX_TESTVIEWID);
+ return;
+ }
+ // 新增:检查showView越界,避免ClickFunc/SetVisible越界
+ if (showView < 0 || showView > MAX_TESTVIEWID)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView:: SystemViewId Overstep ones bounds");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView:: showView(%d) Overstep ones bounds [0, %d]", showView, MAX_TESTVIEWID);
return;
}
+
if (SystemScrollView[hideView] != nullptr)
{
SystemScrollView[hideView]->SetVisible(false);
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView:: SystemScrollView[%d] is nullptr", hideView);
}
+
ClickFunc(showView);
+
if (SystemScrollView[showView] != nullptr)
{
SystemScrollView[showView]->SetVisible(true);
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView:: SystemScrollView[%d] is nullptr", showView);
}
+
if (hideView != 0)
{
+ // 2. 修复:核心防死机 - 检查group是否为空(避免group->Remove()空指针崩溃)
+ if (group == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView:: group is nullptr, skip remove/delete");
+ return;
+ }
+
switch (hideView)
{
case QRCODE:
- group->Remove(SystemScrollView[hideView]);
+ // 3. 修复:Remove前检查SystemScrollView[hideView]是否为空
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_QRCode_view;
test_QRCode_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case VISON:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_about_view;
test_about_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case LCD:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_LCD_view;
test_LCD_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case TP:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_TP_view;
test_TP_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#ifdef SUPPORT_MAG_SERVICE
+ #ifdef SUPPORT_MAG_SERVICE
case MAGETIC:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_MG_view;
test_MG_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#endif
+ #endif
case LUMINANCE:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_lum_view;
test_lum_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case CHARG:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_charging_view;
test_charging_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-
case SPEAK:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_speak_view;
test_speak_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case MOTOR:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_motor_view;
test_motor_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#ifdef SUPPORT_CAT1_SERVICE
+ #ifdef SUPPORT_CAT1_SERVICE
case CAT1:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_cat1_view;
test_cat1_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#endif
+ #endif
case BUTTON:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_KEY_view;
test_KEY_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case MICROPHONE:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_MP_view;
test_MP_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case HRSENSON:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_hr_view;
test_hr_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case GSENSON:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_G_view;
test_G_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case OLDTEST:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_old_view;
test_old_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case BTTEST:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_BT_view;
test_BT_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
case SEChipTest:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_SEChip_view;
test_SEChip_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
- // case PingTest:
- // group->Remove(SystemScrollView[hideView]);
- // delete test_Ping_view;
- // test_Ping_view = nullptr;
- // SystemScrollView[hideView] = nullptr;
- // break;
-#if defined(SUPPORT_GNSS)
+ #if defined(SUPPORT_GNSS)
case GPSTEST:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_GPS_view;
test_GPS_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#endif
-#ifdef SUPPORT_A5133_SERVICE
+ #endif
+ #ifdef SUPPORT_A5133_SERVICE
case RF5133:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_A5133_view;
test_A5133_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#endif
-#if defined(ENABLE_LQBP002TA)
+ #endif
+ #if defined(ENABLE_LQBP002TA)
case PRESSURETEST:
- group->Remove(SystemScrollView[hideView]);
+ if (SystemScrollView[hideView] != nullptr)
+ group->Remove(SystemScrollView[hideView]);
delete test_pressure_view;
test_pressure_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#endif
+ #endif
default:
break;
}