2014-03-07 39 views
0

我在使用c編寫Linux服務,所以我需要保持內存使用穩定。但是追蹤一天之後,記憶就會升高。 如果我從Linux中的系統監視器進行監視,它會提高1M和mem%(0 - > 0.1)。 在pmap命令中,它也會引發1M。私人內存使用不斷提高在Linux中使用c [解決]

我有使用valgrind來檢查是否有任何內存泄漏,並且如果我運行一次就報告沒有。 如果我啓動服務並使用valgrind,它會報告我釋放無效指針。 所以,我認爲它應該有一些關於我的指針。

struct list { 
    int no; 
    BYTE parm[SLEN]; 
    struct list *next; 
}; 

struct list *memory_current; 
struct list *memory_head; 
struct list *memory_prev; 

int getMemoryUsage(int sendCmd) { 
    pthread_mutex_lock(&lock); 
    FILE *fp = NULL; 
    BYTE buffer[10] = ""; 
    BYTE memorys[10] = ""; 
    int flag = 0; 

    TRY { 
     if ((fp = popen("free_data=$(free -m | grep Mem);total=$(echo $free_data | cut -f2 -d' ');" 
      "free_data=$(free -m | grep 'buffers/cache');buffers=$(echo $free_data | cut -f3 -d' ');echo $(($buffers*100/$total))", "r")) == NULL) { 
      THROW(CMD_NOT_FND); 
     } 
     else { 
      while (fgets(buffer, sizeof(buffer), fp) != NULL) { 
       strcat(memorys, buffer); 
       memory_current = (struct list *)malloc(sizeof(struct list)); 

       if (memory_current == NULL) { 
        THROW(MALLOC_ERROR); 
       } 
       memory_current->next = NULL; 
       strncpy(memory_current->parm, buffer, SLEN -1); 
       memory_current->parm[SLEN -1] = '\0'; 

       if (memory_head == NULL) 
        memory_head = memory_current; 
       else 
        memory_prev->next = memory_current; 
       memory_prev = memory_current; 
       memset(buffer, 0, sizeof(buffer)); 
       flag = 1; 
      } 

      if (flag == 0) 
       THROW(CMD_NOT_FND); 
     } 
    } 
    CATCH (CMD_NOT_FND) { 
     memorys[0] = 'n'; 
     memorys[1] = '/'; 
     memorys[2] = 'a'; 
     printf("Memory Usage % : %s\n", memorys); 
     printLog("Memory Usage % ->", memorys); 
    } 
    CATCH (MALLOC_ERROR) { 
     memorys[0] = 'n'; 
     memorys[1] = '/'; 
     memorys[2] = 'a'; 
     printf("Memory Usage malloc error : %s\n", memorys); 
     printLog("Memory Usage malloc error ->", memorys); 
    } 
    FINALLY { 
     pclose(fp); 
//  printf("Memory Usage % : %s\n", memorys); 
//  printf("Memory Usage length %d\n", strlen(memorys)); 
    } 
    ETRY; 

    if (sendCmd == 1) { 
     if (flag != 0) { 
      memory_current = memory_head; 
      int totalMemory = 0; 
      int count = 0; 
      int avg = 0; 
      int perc = 0; 
      BYTE avg_memory[10] = ""; 

      while (memory_current != NULL) { 
       sscanf(memory_current->parm, "%d", &perc); 
       totalMemory += perc; 
       memory_current = memory_current->next; 
       count++; 
      } 
      avg = totalMemory/count; 
      snprintf(avg_memory, sizeof(avg_memory), "%d", avg); ; 
      strcat(avg_memory, ";"); 
      printf("Memory Usage % : %s\n", avg_memory); 
      printLog("Memory Usage % ->", avg_memory); 

      // free linked list 
      memory_current = memory_head; 

      while (memory_current != NULL) { 
       memory_prev = memory_current; 
       memory_current = memory_current->next; 
       free(memory_prev); 
       memory_prev = NULL; //fix dangling 
      } 
      head_memory = NULL; //fix dangling 
      current_memory = NULL; //fix dangling 
     } 
    } 

    pthread_mutex_unlock(&lock); 
    return 0; 
} 

我有全局指針來記錄計時器中的內存使用情況,我將使用結果並在一段時間內清除列表。 我使用相同的方式在其他函數中使用,內存使用情況良好,但指針是本地的,並在最後釋放。

請幫忙指教或指出我的指針使用情況有什麼問題。 謝謝。

[更新] 我發現這可能是dangling pointer,所以我在空閒後將指針設置爲NULL。 到目前爲止內存不會升高,但我會繼續觀看它更多的日子。 [更新] 內存不會再次升高,所以我猜這是懸掛指針問題。

+0

[請不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。而且,這個循環'strcat(memorys,buffer);'看起來非常危險並且可能會溢出。 – unwind

+0

感謝您的評論 – sowrdking

+0

請接受幫助您的答案,而不是編輯您的帖子以添加[解決]。 – Mauren

回答

0

memory_current,memory_headmemory_prev未被初始化爲NULL。

你檢查:

if (memory_head == NULL) 

memory_head沒有初始化,因此你也許寬鬆一些內存分配

也像他們應該是局部變量,而不是全局性的。

+0

全局變量在啓動時被初始化爲零,所以這不是問題。 –