【隨筆】cJSON內(nèi)存泄露問題
在網(wǎng)上搜到cJSON通過cJSON_CreateObject()來添加節(jié)點,其實這樣是錯誤的,這樣會使得該根部節(jié)點下創(chuàng)建的節(jié)點無法釋放內(nèi)存。
`
void update_info(void)
{
cJSON* Data_ReadytoSend=NULL;
cJSON* DR_Data=NULL;
cJSON* Sensitivity_data=NULL;
cJSON* Version_data=NULL;
char* data_buffer;
Data_ReadytoSend = cJSON_CreateObject();
DR_Data = cJSON_CreateObject();
Sensitivity_data = cJSON_CreateObject();
Version_data = cJSON_CreateObject();
cJSON_AddItemToObject(Data_ReadytoSend, "Digital Potentiometer", DR_Data);
cJSON_AddNumberToObject(DR_Data, "CH1", Settings.Register1_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH2", Settings.Register1_RADC2);
cJSON_AddNumberToObject(DR_Data, "CH3", Settings.Register2_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH4", Settings.Register2_RADC2);
cJSON_AddNumberToObject(DR_Data, "CH5", Settings.Register3_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH6", Settings.Register3_RADC2);
cJSON_AddNumberToObject(DR_Data, "CH7", Settings.Register4_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH8", Settings.Register4_RADC2);
cJSON_AddItemToObject(Data_ReadytoSend, "Port Sensitivity", Sensitivity_data);
cJSON_AddNumberToObject(Sensitivity_data, "Port1", Settings.Port1_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port2", Settings.Port2_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port3", Settings.Port3_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port4", Settings.Port4_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port5", Settings.Port5_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port6", Settings.Port6_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port7", Settings.Port7_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port8", Settings.Port8_Sensitivity);
cJSON_AddStringToObject(Data_ReadytoSend, "Version", "V1.1");
data_buffer = cJSON_Print(Data_ReadytoSend);
Serial.println(data_buffer);
// writeFile(LittleFS, CONFIG_FILE, (uint8_t*)cJSON_Print(Data_ReadytoSend));
cJSON_free(data_buffer);
cJSON_Delete(Data_ReadytoSend);
cJSON_Delete(DR_Data);
cJSON_Delete(Sensitivity_data);
cJSON_Delete(Version_data);
}
正確的方法應(yīng)該是使用cJSON_AddObjectToObject()來創(chuàng)建目錄節(jié)點,這樣子就不會有內(nèi)存泄露的問題。
void update_info(void)
{
cJSON* Data_ReadytoSend=NULL;
cJSON* DR_Data=NULL;
cJSON* Sensitivity_data=NULL;
cJSON* Version_data=NULL;
char* data_buffer;
Data_ReadytoSend = cJSON_CreateObject();
DR_Data = cJSON_AddObjectToObject(Data_ReadytoSend, "Digital Potentiometer");
cJSON_AddNumberToObject(DR_Data, "CH1", Settings.Register1_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH2", Settings.Register1_RADC2);
cJSON_AddNumberToObject(DR_Data, "CH3", Settings.Register2_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH4", Settings.Register2_RADC2);
cJSON_AddNumberToObject(DR_Data, "CH5", Settings.Register3_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH6", Settings.Register3_RADC2);
cJSON_AddNumberToObject(DR_Data, "CH7", Settings.Register4_RADC1);
cJSON_AddNumberToObject(DR_Data, "CH8", Settings.Register4_RADC2);
Sensitivity_data = cJSON_AddObjectToObject(Data_ReadytoSend, "Port Sensitivity");
cJSON_AddNumberToObject(Sensitivity_data, "Port1", Settings.Port1_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port2", Settings.Port2_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port3", Settings.Port3_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port4", Settings.Port4_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port5", Settings.Port5_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port6", Settings.Port6_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port7", Settings.Port7_Sensitivity);
cJSON_AddNumberToObject(Sensitivity_data, "Port8", Settings.Port8_Sensitivity);
Version_data = cJSON_AddObjectToObject(Data_ReadytoSend, "Version");
cJSON_AddStringToObject(Version_data, "Version", "V1.1");
data_buffer = cJSON_Print(Data_ReadytoSend);
Serial.println(data_buffer);
// writeFile(LittleFS, CONFIG_FILE, (uint8_t*)cJSON_Print(Data_ReadytoSend));
cJSON_free(data_buffer);
cJSON_Delete(Data_ReadytoSend);
}
`

浙公網(wǎng)安備 33010602011771號