2014-10-02 49 views
1

我在我的程序中使用cJSON將我的值轉換爲JSON並將其寫入文件。這裏是我的代碼的例子:cJSON內存泄漏

void writeStructToFile(IOPipe this, struct structtype somevalues) { 
    cJSON *jout = cJSON_CreateObject(); 
    cJSON_AddItemToObject(jout, "V1", cJSON_CreateNumber(somevalues.v1)); 
    cJSON_AddItemToObject(jout, "V2", cJSON_CreateNumber(somevalues.v2)); 
    fprintf(this->outstream, "%s", cJSON_Print(jout)); 
    cJSON_Delete(jout); 
} 

偉大的作品,但過一段時間後,我發現,Linux操作系統(嵌入式)殺死,因爲異常內存使用或設備(上Cortex A8的)我的程序只是掛起。在調試後我發現,即使我在最後刪除指針,該泄漏也完全出現在該函數中。任何人都可以看到泄漏?

+0

那麼,當這個函數爲空(或者當你沒有調用它)時,內存泄漏會消失嗎? – 2014-10-02 10:21:46

+0

是的,只是評論了這個功能,在終端中用「ps」檢查我的程序,並看到穩定的內存使用情況。沒有註釋,看到這個值慢慢上升,但是在工作10分鐘後它掛起系統,所以我不能再次連接它 – PaulPonomarev 2014-10-02 10:28:43

+0

好吧。如果你註釋掉'fprintf()'行呢? – 2014-10-02 10:46:42

回答

5

最初我以爲它可能是FILE I/O的內部緩衝區。但是當它們變得太大時會自動刷新。

真正的泄漏是cJSON_Print分配內存:一個char數組。你必須大功告成後釋放此:

char* text = cJSON_Print(jout); 
fprintf(this->outstream, "%s", text); 
free(text); // As suggested by PaulPonomarev. 

cJSON_Delete(jout); 
+0

好吧,我已經嘗試在寫入fprintf(this-> outstream,「\ n%s \ n」,cJSON_Print(jout))之前(和之後)fprintf和「\ n」之後添加fflush; fflush(這 - > outstream);'。沒有幫助。然後我試着用描述符而不是fprintf寫入文件:'int df = fileno(this-> outstream);寫(df,cJSON_Print(jout),sizeof(cJSON_Print(jout)));'首先 - 它沒有工作,其次 - 它也造成內存泄漏 – PaulPonomarev 2014-10-06 06:57:31

+0

是的!現在內存使用情況穩定。只有當我創建char *時,我需要使用標準函數'free(text)' – PaulPonomarev 2014-10-06 09:53:15

+0

@PaulPonomarev:您還需要檢查'cJSON_Print'是否不返回NULL指針。 (所有的cJSON函數都檢查NULL指針) – FSMaxB 2018-02-02 16:59:08

0

對於一個char *分配cJSON_Print,據說使用cJSON_FreePrintBuffer。

+0

根據https://github.com/DaveGamble/cJSON/issues/190 – JKOlaf 2017-10-24 23:52:09