STM32使用CJSON的一些注意事项

       前几天调试一个项目,遇到了一个尴尬的问题。和大家分享一下!

       因为项目需要用到JSON数据格式,所以按照网上一些教程移植了CJSON,并实现JSON打包发送与接收解析的过程,开始正常,一直运行到几天,突然卡死。因为项目带了freeRTOS,所以一开始想到的就是系统卡死,任务堆栈相关的问题,于是加大任务栈,简化代码,但是始终于事无补。调试了两天,还是没能解决,于是开始仔细排查,究竟是哪里出了bug,最终黄天不负有心人,终于精确定位到代码错误的地方。如下图:

最开始没有添加if(json)判断,便直接进行下面的解析并赋值了。所以导致了后期的不定时卡死,究其原因,是因为if上面一步cJSON_Parse调用里面,间接调用了cJSON_malloc也就是会分配一段内存,但是分配内存也有失败的时候,如果此时,函数返回为空,也即没有分配到内存,仍然继续执行,并最终释放内存时,则会因为内存泄漏等原因导致系统卡死。

所以,为了保险起见,分配内存和释放内存必须成对出现。在前面加上if(json)判断条件,当不为空即申请到内存后,最后才进行释放,这样即可防止内存泄漏。如果不加if也就是说无论是否申请成功,都会进行释放,此时操作的就是一段未知的内存,肯定会出问题。

      好啦,问题解决了,是我自己踩的坑,希望大家以此为鉴,少走弯路。

 

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