Memory 释放cJSON对象时cJSON内存泄漏

Memory 释放cJSON对象时cJSON内存泄漏,memory,cjson,Memory,Cjson,我在使用cJSON库时遇到了一个问题。我假设在一段时间后(40分钟到1小时),内存泄漏会破坏代码 我已将代码复制到下面: void my_work_handler_5(struct k_work *work) { char *ptr1[6]; int y=0; static int counterdo = 0; char *desc6 = "RSRP"; char *id6 = "dBm"; c

我在使用cJSON库时遇到了一个问题。我假设在一段时间后(40分钟到1小时),内存泄漏会破坏代码

我已将代码复制到下面:

void my_work_handler_5(struct k_work *work)
{

     char *ptr1[6];
     int y=0;
     static int counterdo = 0;
     char *desc6 = "RSRP";
     char *id6 = "dBm";
     char *type6 = "RSRP";
     char rsrp_str[100];
     snprintf(rsrp_str, sizeof(rsrp_str), "%d", rsrp_current);

     sensor5 = cJSON_CreateObject();

    cJSON_AddItemToObject(sensor5, "description", cJSON_CreateString(desc6));
    cJSON_AddItemToObject(sensor5, "Time", cJSON_CreateString(time_string));
    cJSON_AddItemToObject(sensor5, "value", cJSON_CreateNumber(rsrp_current));
    cJSON_AddItemToObject(sensor5, "unit", cJSON_CreateString(id6));
    cJSON_AddItemToObject(sensor5, "type", cJSON_CreateString(type6));

       /* print everything */
        ptr1[counterdo] = cJSON_Print(sensor5);

        printk("Counterdo value is : %d\n", counterdo);
         
        cJSON_Delete(sensor5);
        
         counterdo = counterdo + 1;
        
        if (counterdo==6){
        for(y=0;y<=counterdo;y++){
         free(ptr1[y]);
         }
         counterdo = 0;
         }

        return;
}
void my_work_handler_5(结构k_work*work)
{
char*ptr1[6];
int y=0;
静态int计数器DO=0;
char*desc6=“RSRP”;
char*id6=“dBm”;
char*type6=“RSRP”;
char rsrp_str[100];
snprintf(rsrp_str,sizeof(rsrp_str),“%d”,rsrp_current);
sensor5=cJSON_CreateObject();
cJSON_AddItemToObject(传感器5,“描述”,cJSON_CreateString(描述6));
cJSON_AddItemToObject(传感器5,“时间”,cJSON_CreateString(时间字符串));
cJSON_AddItemToObject(传感器5,“值”,cJSON_CreateNumber(rsrp_电流));
cJSON_AddItemToObject(传感器5,“单元”,cJSON_CreateString(id6));
cJSON_AddItemToObject(传感器5,“类型”,cJSON_CreateString(类型6));
/*打印所有内容*/
ptr1[counterdo]=cJSON_打印(传感器5);
printk(“Counterdo值为:%d\n”,Counterdo);
cJSON_删除(传感器5);
counterdo=counterdo+1;
if(counterdo==6){

对于(y=0;y由于cJSON是一个没有依赖项的可移植库,因此最好在PC上查找代码中的潜在问题:它们是此环境中用于促进调查的专用工具。我假设您有一个Linux系统、一个安装了WSL或WSL2的Windows系统,或者一个Linux虚拟机安装了le和gcc、valgrind

代码的最小、自包含、可移植版本可以是:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cJSON.h>

static int rsrp_current = 1;
static char *time_string = NULL;

void
my_work_handler_5 ()
{
  char *ptr1[6];
  int y = 0;
  static int counterdo = 0;
  char *desc6 = "RSRP";
  char *id6 = "dBm";
  char *type6 = "RSRP";
  char rsrp_str[100];
  snprintf (rsrp_str, sizeof (rsrp_str), "%d", rsrp_current);

  cJSON *sensor5 = cJSON_CreateObject ();

  cJSON_AddItemToObject (sensor5, "description", cJSON_CreateString (desc6));
  cJSON_AddItemToObject (sensor5, "Time", cJSON_CreateString (time_string));
  cJSON_AddItemToObject (sensor5, "value", cJSON_CreateNumber (rsrp_current));
  cJSON_AddItemToObject (sensor5, "unit", cJSON_CreateString (id6));
  cJSON_AddItemToObject (sensor5, "type", cJSON_CreateString (type6));

  /* print everything */
  ptr1[counterdo] = cJSON_Print (sensor5);

  printf ("Counterdo value is : %d\n", counterdo);

  cJSON_Delete (sensor5);

  counterdo = counterdo + 1;

  if (counterdo == 6)
    {
      for (y = 0; y <= counterdo; y++)
    {
      free (ptr1[y]);
    }
      counterdo = 0;
    }

  return;
}

int
main (int argc, char **argv)
{
  time_t curtime;

  time (&curtime);

  for (int n = 0; n < 3 * 6; n++)
    {
      my_work_handler_5 ();
    }
}
char *ptr1[6] = { NULL, NULL, NULL, NULL, NULL, NULL };
在程序上运行valgrind:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose   ./cjson
..表示正在释放一些以前未分配的内存:
无效的空闲()/delete/delete[]/realloc()

替换:

  for (y = 0; y <= counterdo; y++)
{
  free (ptr1[y]);
}
char *ptr1[6];
某些内存肯定正在泄漏

原因是
char*ptr1[6]
不是静态的,因此每次调用
my\u work\u handler\u 5()
时都会在堆栈上创建。返回的指针由
cJSON\u Print()
在两次调用之间丢失,并且对任意指针值调用
free()
,因为ptr1[]未按可能的方式初始化:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cJSON.h>

static int rsrp_current = 1;
static char *time_string = NULL;

void
my_work_handler_5 ()
{
  char *ptr1[6];
  int y = 0;
  static int counterdo = 0;
  char *desc6 = "RSRP";
  char *id6 = "dBm";
  char *type6 = "RSRP";
  char rsrp_str[100];
  snprintf (rsrp_str, sizeof (rsrp_str), "%d", rsrp_current);

  cJSON *sensor5 = cJSON_CreateObject ();

  cJSON_AddItemToObject (sensor5, "description", cJSON_CreateString (desc6));
  cJSON_AddItemToObject (sensor5, "Time", cJSON_CreateString (time_string));
  cJSON_AddItemToObject (sensor5, "value", cJSON_CreateNumber (rsrp_current));
  cJSON_AddItemToObject (sensor5, "unit", cJSON_CreateString (id6));
  cJSON_AddItemToObject (sensor5, "type", cJSON_CreateString (type6));

  /* print everything */
  ptr1[counterdo] = cJSON_Print (sensor5);

  printf ("Counterdo value is : %d\n", counterdo);

  cJSON_Delete (sensor5);

  counterdo = counterdo + 1;

  if (counterdo == 6)
    {
      for (y = 0; y <= counterdo; y++)
    {
      free (ptr1[y]);
    }
      counterdo = 0;
    }

  return;
}

int
main (int argc, char **argv)
{
  time_t curtime;

  time (&curtime);

  for (int n = 0; n < 3 * 6; n++)
    {
      my_work_handler_5 ();
    }
}
char *ptr1[6] = { NULL, NULL, NULL, NULL, NULL, NULL };
由于您每6次调用就释放内存,这导致了您怀疑的内存泄漏

替换:

  for (y = 0; y <= counterdo; y++)
{
  free (ptr1[y]);
}
char *ptr1[6];
作者:

编译,再次运行valgrind:

==6834== 
==6834== HEAP SUMMARY:
==6834==     in use at exit: 1,095 bytes in 15 blocks
==6834==   total heap usage: 271 allocs, 256 frees, 14,614 bytes allocated
==6834== 
==6834== Searching for pointers to 15 not-freed blocks
==6834== Checked 75,000 bytes
==6834== 
==6834== 1,095 bytes in 15 blocks are definitely lost in loss record 1 of 1
==6834==    at 0x483DFAF: realloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==6834==    by 0x10B161: print (cJSON.c:1209)
==6834==    by 0x10B25F: cJSON_Print (cJSON.c:1248)
==6834==    by 0x1094AB: my_work_handler_5 (cjson.c:30)
==6834==    by 0x10959C: main (cjson.c:59)
==6834== 
==6834== LEAK SUMMARY:
==6834==    definitely lost: 1,095 bytes in 15 blocks
==6834==    indirectly lost: 0 bytes in 0 blocks
==6834==      possibly lost: 0 bytes in 0 blocks
==6834==    still reachable: 0 bytes in 0 blocks
==6834==         suppressed: 0 bytes in 0 blocks
==6834== 
==6834== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
==6927== 
==6927== HEAP SUMMARY:
==6927==     in use at exit: 0 bytes in 0 blocks
==6927==   total heap usage: 271 allocs, 271 frees, 14,614 bytes allocated
==6927== 
==6927== All heap blocks were freed -- no leaks are possible
==6927== 
==6927== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

该程序的修改版本现在应该可以在您的裸机系统上运行。

您好,请继续阅读并相应修改您的代码好吗?您的代码当前未编译,因为
rsrp\u current
time\u string
struct k\u work
不是您提供的代码的一部分。
\include
缺失同样。这使得人们更难帮助您解决所面临的问题。您的代码最好至少可以编译。
sensor5
的声明也丢失了。您的程序中有一个错误:您正在声明
char*ptr1[6];
,因此,
ptr
的有效索引为0,1,2,3,4,5。但您正在释放循环中的
ptr[6]
:用于(Y=0;YHI @ Adeel Ahmed。如果这个或任何答案已经解决了你的问题,请通过点击复选标记来考虑。这向更广泛的社区表明,你已经找到了解决方案并给回答者和你自己带来了一些声誉。当然,没有义务这样做。