STM32使用CJSON的一些注意事項

       前幾天調試一個項目,遇到了一個尷尬的問題。和大家分享一下!

       因爲項目需要用到JSON數據格式,所以按照網上一些教程移植了CJSON,並實現JSON打包發送與接收解析的過程,開始正常,一直運行到幾天,突然卡死。因爲項目帶了freeRTOS,所以一開始想到的就是系統卡死,任務堆棧相關的問題,於是加大任務棧,簡化代碼,但是始終於事無補。調試了兩天,還是沒能解決,於是開始仔細排查,究竟是哪裏出了bug,最終黃天不負有心人,終於精確定位到代碼錯誤的地方。如下圖:

最開始沒有添加if(json)判斷,便直接進行下面的解析並賦值了。所以導致了後期的不定時卡死,究其原因,是因爲if上面一步cJSON_Parse調用裏面,間接調用了cJSON_malloc也就是會分配一段內存,但是分配內存也有失敗的時候,如果此時,函數返回爲空,也即沒有分配到內存,仍然繼續執行,並最終釋放內存時,則會因爲內存泄漏等原因導致系統卡死。

所以,爲了保險起見,分配內存和釋放內存必須成對出現。在前面加上if(json)判斷條件,當不爲空即申請到內存後,最後才進行釋放,這樣即可防止內存泄漏。如果不加if也就是說無論是否申請成功,都會進行釋放,此時操作的就是一段未知的內存,肯定會出問題。

      好啦,問題解決了,是我自己踩的坑,希望大家以此爲鑑,少走彎路。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章