【问题标题】:Memory leak with out malloc [closed]没有malloc的内存泄漏[关闭]
【发布时间】:2012-11-18 01:03:07
【问题描述】:

我写了一个程序,但是我发现它有内存泄漏,经过几次迭代后,它出现了段错误。我不明白这个内存泄漏在哪里。

下面是完整的代码sn-p。我知道代码存在常规错误,例如全局分配和制作比需要大得多的缓冲区。我只是看不到泄漏的来源。

提前致谢。

#include <stdlib.h>
#include <stdio.h>

#define DATA 1000
#define TRUE 1
#define FALSE 0
const int16_t TIME = 600; // Time in seconds.
const int8_t DEBUG = 0;
// Globals Because I'm lazy!
long int cpua[5];
long int cpub[5];
long int mema[2];
long int nets[2];
long int netr[2];
int k=0;
char ch[150];
FILE *file_read;
char buffer[DATA];

void CPUread(void){
    file_read = popen("cat /proc/stat | grep \"cpu \"","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%s %ld %ld %ld %ld %ld",&ch[0],&cpua[0],&cpua[1],&cpua[2],&cpua[3],&cpua[4]);

    // Time to read the network..
    file_read = popen("ifconfig | grep -m 1 \"RX bytes:\" | awk -F \"[^0-9]*\" '{ print $2 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&netr[0]);
    file_read = popen("ifconfig | grep -m 1 \"RX bytes:\" | awk -F \"[^0-9]*\" '{ print $5 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&nets[0]);

    // Time to read memory
    file_read = popen("cat /proc/meminfo | grep -m 1 \"MemFree\" | awk -F \"[^0-9]*\" '{ print $2 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&mema[0]);

    file_read = popen("cat /proc/meminfo | grep -m 1 \"MemTotal\" | awk -F \"[^0-9]*\" '{ print $2 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&mema[1]);
}


void main(void){
    FILE *file_write, *fp;
    int i;
    long int total=0, ptotal=0;
    int valid = FALSE;
    char charbuf[100];
    file_write=popen("echo -n \"/var/www/dir/`date +%Y-%b-%d`.csv\"","r");
    fgets(charbuf,100, file_write);
    while(1){
        // Open up the status file container and read from the system.
        if(valid == FALSE ){

            CPUread();
            // Need to make a new file here.... With Date code.
            fp=fopen(charbuf,"a");
            if ( fp == NULL){
                perror("Dummy Spit In initial File create!\n");
                exit(-1);
            }
            fprintf(fp,"CPU,IOwait,Memory,KB_up,KB_down\n");
            if(DEBUG) printf("CPU,IOwait,Memory,KB_up,KB_down\n");
            valid = TRUE;
            fclose(fp);
        }else{
            for(i=0;i<5;i++) cpub[i] = cpua[i];
            nets[1]=nets[0];
            netr[1]=netr[0];
            CPUread();

            total = 0;
            for(i=0;i<5;i++){
                cpub[i]=cpua[i]-cpub[i];
                total+=cpub[i];
            }
            // Time to find the CPU useage and IO waits...
            fp=fopen(charbuf,"a");
            if ( fp == NULL){
                perror("Dummy Spit Trying to open file\n");
                exit(-1);
            }
            fprintf(fp,"%0.2f,%0.2f,%0.2f,%ld,%ld\n",(((float)cpub[0])/total)*100,(((float)cpub[4]/total)*100),((((float)mema[1]-(float)mema[0])/(float)mema[1]))*100,(nets[0]-nets[1])/1024,(netr[0]-netr[1])/1024);
            if(DEBUG) printf("%0.2f,%0.2f,%0.2f,%ld,%ld\n",(((float)cpub[0])/total)*100,(((float)cpub[4]/total)*100),((((float)mema[1]-(float)mema[0])/(float)mema[1]))*100,(nets[0]-nets[1])/1024,(netr[0]-netr[1])/1024);
            fclose(fp);
        }
    sleep(TIME);
    }
} 

【问题讨论】:

  • 在调试器中运行。由于您没有这样做,因此认为研究工作不佳。
  • Segfault 与内存泄漏不同。
  • 您使用什么编译器标志?你试过在 Valgrind 下运行吗?
  • 当然它有内存泄漏,因为你做了很多你永远不会关闭的popens。请不要浪费人们的时间发布如此明显的错误。
  • 已删除 - 一堆类似的评论...

标签: c linux memory-management memory-leaks


【解决方案1】:

我相信您需要在 CPUread() 函数中对从 popen() 返回的描述符调用 pclose()。

在此处查看 popen() 文档:

popen() man page on die.net

我不确定这是否直接导致您的问题,但肯定是资源泄漏。

【讨论】:

    【解决方案2】:

    我看到很多 popen() 但没有 pclose()...

    【讨论】:

      【解决方案3】:

      除了您需要使用 pclose() 之外,请确保使用 valgrind 运行您的程序,以便您知道问题已解决。

      【讨论】:

        猜你喜欢
        • 2020-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 2013-03-29
        • 2010-11-28
        相关资源
        最近更新 更多