我在使用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。 到目前爲止內存不會升高,但我會繼續觀看它更多的日子。 [更新] 內存不會再次升高,所以我猜這是懸掛指針問題。
[請不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。而且,這個循環'strcat(memorys,buffer);'看起來非常危險並且可能會溢出。 – unwind
感謝您的評論 – sowrdking
請接受幫助您的答案,而不是編輯您的帖子以添加[解決]。 – Mauren