2016-04-17 29 views
2

次のwifi_json()メソッドは、テストするwhileループで呼び出すとメモリを増加し続けます。それは解放されないメソッドで使用される構造体または私は正しくメモリを解放する無料のメソッドを使用しないためですか?C言語でメモリを解放することはできません

#include "MiCO.h" 
#include "json_c/json.h" 
#define os_json_log(M, ...) custom_log("JSON", M, ##__VA_ARGS__) 
void wifi_json() 
{ 
    os_json_log("%s","start"); 
    struct json_object *recv_json_object_device_wifi=NULL; 
    recv_json_object_device_wifi=json_object_new_object();  

    struct json_object *recv_json_object_array_wifi=NULL; 
    recv_json_object_array_wifi=json_object_new_array(); //wifi array 

    struct json_object *recv_json_object_wifi=NULL; //recv wifi 
    recv_json_object_wifi=json_object_new_object(); 

    struct json_object *wifi_object=NULL; //wifi 
    wifi_object=json_object_new_object(); 

    //wifi 
json_object_object_add(wifi_object, "connected", json_object_new_string("1"));  
json_object_object_add(wifi_object, "strength", json_object_new_string("60")); 
json_object_object_add(wifi_object, "ip", json_object_new_string("60")); 
json_object_object_add(wifi_object, "mac", json_object_new_string("60")); 
json_object_object_add(wifi_object, "ssid", json_object_new_string("60")); 
json_object_object_add(recv_json_object_wifi,"WIFI",wifi_object); 

json_object_array_add(recv_json_object_array_wifi,recv_json_object_wifi); 
json_object_array_add(recv_json_object_array_wifi,recv_json_object_wifi); 
json_object_array_add(recv_json_object_array_wifi,recv_json_object_wifi); 

json_object_object_add(recv_json_object_device_wifi,"WIFI_Info",recv_json_object_array_wifi); 
os_json_log("%s",json_object_to_json_string(recv_json_object_device_wifi)); 

free(recv_json_object_device_wifi); 
recv_json_object_device_wifi=NULL; 

free(recv_json_object_array_wifi); 
recv_json_object_array_wifi=NULL; 

json_object_put(recv_json_object_wifi); 
json_object_put(wifi_object); 


json_object_put(recv_json_object_array_wifi); 
json_object_put(recv_json_object_device_wifi); 
} 
int application_start(void) 
{ 
while(1) 
{ 
    wifi_json(); 
    os_json_log("Free memory has %d bytes", MicoGetMemoryInfo()->free_memory) ; 
    } 
    } 

答えて

1

私はあなたの問題がos_json_log("%s",json_object_to_json_string(recv_json_object_device_wifi));であると思います。

ポインタを割り当てて後で解放する必要があります。それは他のすべてが付加されたルートオブジェクトであるとしてだけ

json_object_put(recv_json_object_device_wifi); 

をやっさらに

const char *str = json_object_to_json_string(recv_json_object_device_wifi); 
os_json_log("%s", str); 
free(str); 

は、十分です。その子供のいずれかにjson_object_putに電話する必要はありません。

2

あなたは、これらの2により作成されたメモリを解放する必要があります。

struct json_object *recv_json_object_wifi=NULL; //recv wifi 
recv_json_object_wifi=json_object_new_object(); 

struct json_object *wifi_object=NULL; //wifi 
wifi_object=json_object_new_object(); 
+0

私はこれら2つのオブジェクトを解放しようとしましたが、影響はありません。無料(recv_json_object_wifi); recv_json_object_wifi = NULL; 無料(wifi_object); wifi_object = NULL; –

+1

@vajojaもしあなたがmallocを呼んでいないなら、無料で呼び出すべきではありません。ですから、 'free'の代わりに' json_object_put'を使用してください – Zaffy

関連する問題