1. 程式人生 > >stm32 移植cJson 注意free釋放記憶體!!

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_malloc)(size_t sz) = mymalloc;
 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了。還好最後解決了。

相關推薦

stm32 移植cJson 注意free釋放記憶體

如題: 關於怎麼移植的網上有很多參考文件,也很簡單,因為cjson只有2個檔案,一個cJSON.c 一個cJSON.h檔案。 我用的是原子的stm32 工程檔案測試,他們有自己定義的malloc.c      malloc.h,很方便可以直接用。 需要修改的就是下面:把原

STM32移植cJSON注意free釋放記憶體

如題: 關於怎麼移植的 網上有很多參考文件,也很簡單,因為cjson只有2個檔案,一個cJSON.c 一個cJSON.h檔案。 關於如何釋放記憶體,自己除錯的時候也是搜了度娘,網上好多方法並不正確,故寫下此文件 使用時的流程是: cJSON * root;

STM32移植cJson和FreeRTOS時,cjson解析和建立失敗問題

版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/u013184273/article/details/84870672 一,環境:STM32+cJson+FreeRTOS+Heap_4.c 二,FREERTOS的記憶體:Heap_4 Fre

在子函式中malloc分配記憶體free釋放記憶體的方法(基於C)

1. 子函式malloc分配記憶體        為了增強程式可讀性,有時會在子函式中malloc分配記憶體。測試瞭如下三種方法,容易想到的是第一種。事實證明這種也是錯誤的! #include <stdio.h> #include &l

C 語言執行free()釋放記憶體時 報錯

今天遇到了一個問題。先用malloc()分配一定大小的記憶體,然後在主函式最後要對這些記憶體進行釋放。呼叫free函式,執行報錯。單步除錯 執行free()後的報錯如圖 1所示。 最終發現我是這樣做的:例如 分配10個元素記憶體,我對這10個元素進行了賦值,最後是呼叫了fr

[CareerCup] 13.9 Aligned Malloc and Free Function 寫一對申請和釋放記憶體函式

13.9 Write an aligned malloc and free function that supports allocating memory such that the memory address returned is divisible by a specific power of

乾貨c++new和delete工作原理 以及 針對連結串列節點過載operator new 和operator delete 實現連結串列節點使用記憶體池申請和釋放空間

第一部分: new和delete的實現原理 開始談之前我們應該瞭解另一個概念“operator new”和“operator delete”: new操作符呼叫一個函式來完畢必需的記憶體分配,你可以重寫或過載這個函式來改變它的行為。new操

arcengine 開發幾個注意釋放記憶體的地方

在迴圈、查詢過程中經常出現如下錯誤:  1 、迴圈的 遊標一定要釋放不然會報錯。 private void find_allroads_lxbm(IFeature feature_ld, string lxbm) { try

關於free如何知道要釋放記憶體空間的長度問題

在學記憶體分配的問題的時候,malloc和calloc都要指定需要分配記憶體的大小,但是free的就不需要,我就納悶free是咋知道從指標地址開始的多少長度是被分配了的? 當時就想,在malloc或者calloc的時候,編譯器應該把大小的數值放到哪個地方了,當free

stm32使用cjson檔案解析json檔案,分配記憶體宕機問題解決方案

使用乙太網從伺服器上拉取json字串,接收之後進行解析,但是cjson的包在使用malloc和free的時候經常出現問題,在研究stm32的記憶體分配問題之後,網上很多說是要自己寫記憶體管理,但是實際使用會產生很多問題,但是檢視手冊發現stm32F407本身已經有192kb的

vector 釋放記憶體需不需要delete

是否需要delete是看你有沒有用new. 具體的幾個例子說明: vector<int> vIntList; //這個是不用delete的. vector<char*> vPointList; char 

Tomcat下載以及安裝、eclipse工具配置tomcat9的具體步驟以及注意事項

      (小白經驗,大咖勿噴) 開始學前端的一些技術了,最讓人頭疼的就是環境的配置以及必要軟體的安裝,比如資料庫mysql、伺服器Tomcat、eclipse工具等等。  自己也度娘了很多大咖的經驗,但看到的教程以及經驗都很久了,我下載安裝的又是最新版

C#釋放記憶體的方法

原文:https://blog.csdn.net/zsy619/article/details/79181719 ---------------------  如何釋放記憶體: [DllImport("kernel32.dll", EntryPoint = "SetProcessWork

YUV與RGB互轉各種公式 (YUV與RGB的轉換公式有很多種,請注意區別)

一、 公式:基於BT.601-6       BT601 UV 的座標圖(量化後): (橫座標為u,縱座標為v,左下角為原點)           通過座標圖我們可以看到UV並不會包含整個座標系,而是呈一個旋轉了一

Linux伺服器釋放記憶體指令碼

1)在root目錄下建立一個freemem.sh的指令碼: vi freemem.sh #!/bin/bash used=`free -m | awk 'NR==2' | awk '{print $3}'` free=`free -m | awk 'NR==2' | awk '{print

iOS開發 字串中帶中文的注意

說一下我自己遇到的問題吧,歡迎評論增加! 1、使用AFNetworking下載檔案,下載連結中包含中文,下載失敗 解決方法:除正常校驗下載連結外,增加一個編碼的過程 NSCharacterSet *characterSet = [NSCharacterSet URLQueryAllo

STM32移植STemwin,跑FREERTOS (作者:wenyun 日期:20180907)

首先,非常感謝正點原子、安富萊、野火等等,感謝他們公開原始碼,分享各種資料,給我在嵌入式這條道路上提供了很多的幫助。 以下移植使用的平臺是正點原子的戰艦STM32開發板,液晶屏驅動是ILI9341。 一、移植步驟 注:移植液晶屏:ILI9341 1、下載STemwin522原始碼

分盤的教訓 -pagefile.sys- 虛擬記憶體 OwO

前言:血的教訓,剛剛把 C 盤容量擴了 12G,後面卻導致驅動器號紊亂。 比如本來我的程式碼盤是在 F 盤,即 DATA(F:),另一個軟體盤是 DQ(E:),聯想電腦的盤是 LENOVO(D:),從 LENOVO 盤移走 12G 到了 C 盤容量後我的程式碼盤變成了 DATA(D:),在磁碟管理器

記錄一個自己放的小錯誤,python程式設計的,要注意同名變數

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import numpy as np import matplotlib.pyplot as plt tf.set_random_s

swap自動釋放記憶體

#free -mh 如上圖,一般情況下不會用到swap的,一般實體記憶體使用在90%以上(預設是這個數,可以自行在/etc/sysctl.conf裡設定vm.swappiness引數),但有的時候,記憶體會被快取佔用,導致系統開始使用swap空間,此時就需要清理下swap了 這裡先說下vm.swap