stm32 移植cJson 注意free釋放記憶體!!
如題:
關於怎麼移植的網上有很多參考文件,也很簡單,因為cjson只有2個檔案,一個cJSON.c 一個cJSON.h檔案。
我用的是原子的stm32 工程檔案測試,他們有自己定義的malloc.c malloc.h,很方便可以直接用。
需要修改的就是下面:把原本的json malloc 和free替換成我們自己的,如下程式碼
static void *(*cJSON_malloc)(size_t sz) = malloc; static void (*cJSON_free)(void *ptr) = free; ----------------------------------------
void (*cJSON_free)(void *ptr) = myfree;
void cJSON_InitHooks(cJSON_Hooks* hooks) { if (!hooks) { /* Reset hooks */ cJSON_malloc = malloc; cJSON_free = free; return; } //cJSON_malloc = (hooks->malloc_fn) ? hooks->malloc_fn : malloc; //cJSON_free = (hooks->free_fn) ? hooks->free_fn : free; cJSON_malloc = (hooks->malloc_fn) ? hooks->malloc_fn : mymalloc; cJSON_free = (hooks->free_fn) ? hooks->free_fn : myfree; }
通過上面這樣修改就可以執行例子了。
程式碼執行可以,但是有個問題要注意:
我們在 執行 p=cJSON_Print(root);
後務必要要進行如下釋放操作
cJSON_Delete(root);
free(p)
關於free這點特別加粗注意,我被這個問題困擾兩天,預設網上的介紹都是這樣寫的,編譯程式碼也沒要出現錯誤。
其實不對的,應該使用myfree(p); 這個函式才能給真正釋放記憶體,要不然程式跑幾分鐘就卡死了,這個特別要注意。喜歡做驗證的朋友可以自己測試下。
這問題不容易發現,我幾乎快放棄cjson了。還好最後解決了。