0

下面是脚本的一部分,同样是从 main 函数调用的。如果我注释掉以下函数,则一切正常,没有任何内存泄漏问题,而通过包含此函数,该过程最终会出现内存泄漏,并最终在 2 小时内停止。

void passRFIDInfo(int antenna_id, int peakRssi, char *fast_id, int reader_mac_flag, int data_accumulated_flag){

  if (reader_mac_flag == 0){
    struct ifreq s;

      int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);


    strcpy(s.ifr_name, "eth0");
    if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
    int i;

    for (i = 0; i < 6; ++i){
      unsigned char data  =  s.ifr_addr.sa_data[i];
      sprintf(reader_mac+(i*2), "%02x", data);
    }
    reader_mac[12] = '\0';
    }
  }

  char uniqueID[40];



  char *antennaID = (char*)malloc(2);
  snprintf(antennaID, sizeof(antennaID), "%d", antenna_id);


  strcpy(uniqueID, reader_mac);

  strcat(uniqueID, ".");
  strcat(uniqueID, antennaID);
  strcat(uniqueID, ".");
  strcat(uniqueID, fast_id);



  int json_size = json_object_size(root);

  if (data_accumulated_flag==1 && json_size!=0) 
  {

    sendMQTT(rfid_json_dict);

    free(rfid_json_dict);      
    json_decref(root);

    json_t *root = json_object();  
    char *rfid_json_dict;
  }

  json_object_set_new( root, uniqueID, json_integer(peakRssi));
  rfid_json_dict = json_dumps(root, 0);

  printf("rfid_json_dict ::%s\n",rfid_json_dict);
  printf("\n");

}

在程序执行之前,嵌入式 linux 平台中的可用内存是,

>show system cpu
Status='0,Success'
TotalMemory='62304256'
FreeMemory='18621122'
CPUUtilization='3'

随着执行持续 2 小时等,FreeMemory 不断下降,最终在 3 小时结束时,进程自动终止。如何解决此类问题?

4

1 回答 1

0

正如评论中指出的那样,您错过了对free()on的调用antennaID。所以你malloc()记住了它,但它永远不会被释放。所以它只会不断堆积。

一般规则是,对于每次调用malloc(),都应该调用free()。至少,我是这样学习的,这对我来说最有意义。一旦你使用完一个变量,你就应该使用free()它。简要浏览该代码,它看起来好像从未离开antennaID过该功能?所以你应该在函数返回之前释放它。

于 2020-06-18T20:11:54.777 回答