C - Как устранить утечки памяти? - PullRequest
0 голосов
/ 18 июня 2020

Ниже приведена часть скрипта, вызываемая из основной функции. Если я закомментирую приведенную ниже функцию, все будет работать нормально без каких-либо проблем с утечкой памяти, тогда как при включении этой функции процесс заканчивается утечкой памяти и в конечном итоге он останавливается в течение 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 часов, процесс завершился автоматически. Как решить такую ​​проблему?

1 Ответ

0 голосов
/ 18 июня 2020

Как было указано в комментариях, вам не хватает вызова free() на antennaID. Итак, у вас malloc() памяти для него, но тогда он никогда не освобождается. Так что он просто накапливается.

Общее правило состоит в том, что для каждого вызова malloc() должен быть вызов free(). По крайней мере, так я узнал, и это наиболее важно для меня. Как только вы закончите использовать переменную, вы должны free() ее. Коротко просматривая этот код, не похоже, что antennaID когда-либо оставляет функцию? Так что вам следует просто освободить его до возврата из функции.

...