在Linux中使用c继续使用私有内存

时间:2014-03-07 01:54:34

标签: c linux pointers memory memory-management

我正在使用c在Linux中编写服务,所以我需要保持内存使用稳定。 但追踪一天后,记忆力提高了。 如果我从Linux中的系统监视器进行监视,它会提高1M和mem%(0 - > 0.1)。 在pmap命令中,它也会引发1M。

我使用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,所以我在free之后将指针设置为NULL。 到目前为止,记忆力不会提高,但我会继续观察更多天。


解决

内存不会再次升起,所以我猜这是悬空指针问题。

1 个答案:

答案 0 :(得分:0)

memory_currentmemory_headmemory_prev未初始化为NULL。

你检查了一下:

 if (memory_head == NULL)

memory_head未初始化时,您可能会丢失一些内存分配

看起来也应该是局部变量,而不是全局变量。