C - 无法释放分配的内存

标签 c memory-management crash free

我目前正在开发的应用程序有问题。在这个程序中,我必须从文本文件中读取大量(数十亿)数据并进行相应的管理,但由于这是一个两个学生的项目,阅读部分将由我的伙伴开发。出于测试原因,我编写了一个生成伪随机结构的小程序来代替我的伙伴将要执行的操作。

问题如下:可以丢弃大量生成的数据(由于冗余)以释放其内存。但即使调用 free() 函数,内存使用量也会不断增加。所以我尝试开发一个调试应用程序,它只生成一大块数据并立即释放它。并重复数千次。 好吧,我不明白原因,但是分配给进程的内存增长到 ~1.8 GB ram 然后崩溃了。 为什么?最奇怪的是,让我觉得有很多我不太了解的地方是,当进程崩溃时,malloc 不会返回 NULL 指针,因为当 readCycles == 6008 时进程总是崩溃并绕过 NULL 检查。

我已经在 StackOverflow 上阅读了其他相关主题,并且我理解了为什么 free() 不会减少分配给我的进程的内存。没关系。但是为什么内存使用量一直在增长? malloc 不应该分配以前释放的内存而不是不断地请求新的内存吗?

这是我的代码中最相关的部分:

#define NREAD 1000
#define READCYCLES 10000
#define N_ALPHA_ILLUMINA 7
#define N_ALPHA_SOLID 5
#define SEQLEN 76

typedef struct{
    char* leftDNA;
    char* leftQuality;
    unsigned long int leftRow;
    char* rightDNA;
    char* rightQuality;
    unsigned long int rightRow;
} MatePair;


unsigned long int readCycles = 0;


MatePair* readStream(MatePair* inputStream, short* eof, unsigned long int* inputSize){

    double r;
    unsigned long int i, j;
    unsigned long int leftRow;
    int alphabet[] = {'A', 'C', 'G', 'T', 'N'};
    inputStream = (MatePair*) malloc (sizeof(MatePair) * (NREAD + 1));
    printf("%d\n", readCycles);
    if (inputStream == NULL){
        (*eof) = 1;
        return;
    }

    for (i = 0; i < NREAD; i++){
        leftRow = readCycles * NREAD + i;
        inputStream[i].leftDNA = (char*) malloc (SEQLEN);
        inputStream[i].rightDNA = (char*) malloc (SEQLEN);
        inputStream[i].leftQuality = (char*) malloc (SEQLEN);
        inputStream[i].rightQuality = (char*) malloc (SEQLEN);
        for (j = 0; j < SEQLEN; j++){
            r = rand() / (RAND_MAX + 1);
            inputStream[i].leftDNA[j] = alphabet[(int)(r * 5)];
            inputStream[i].rightDNA[j] = alphabet[(int)(r * 5)];
            inputStream[i].leftQuality[j] = (char) 64 + (int)(r * 60);
            inputStream[i].rightQuality[j] = (char) 64 + (int)(r * 60);
        }
        inputStream[i].leftDNA[SEQLEN - 1] = '\0';
        inputStream[i].rightDNA[SEQLEN - 1] = '\0';
        inputStream[i].leftQuality[SEQLEN - 1] = '\0';
        inputStream[i].rightQuality[SEQLEN - 1] = '\0';
        inputStream[i].leftRow = leftRow;
        inputStream[i].rightRow = leftRow;
    }

    inputStream[i].leftRow = -1;

    readCycles++;
    (*inputSize) = NREAD;
    (*eof) = readCycles > READCYCLES;

    return inputStream;

}


int main(int argc, char* argv[]){

    short eof = 0;
    unsigned long int inputSize = 0;
    MatePair* inputStream = NULL;

    while (!eof){
        inputStream = readStream(inputStream, &eof, &inputSize);
        free(inputStream);
        inputStream = NULL;
    }

    return 0;

}

我忘了提到这一点,但在发帖之前,我没有调用 free(inputStream),而是尝试调用 freeMemory(inputStream)。不过,不确定这是否是正确的做法。

void freeMemory(MatePair* memblock){

    for ( ; memblock->leftRow != 1; memblock++){
        free(memblock -> leftDNA);
        free(memblock -> leftQuality);
        free(memblock -> rightDNA);
        free(memblock -> rightQuality);
    }

}

最佳答案

内存泄漏。您调用了多少次“malloc()”,您必须使用多少次“free()”来释放堆上所有已分配的内存。

因此,

inputStream[i].leftDNA = (char*) malloc (SEQLEN);
inputStream[i].rightDNA = (char*) malloc (SEQLEN);
inputStream[i].leftQuality = (char*) malloc (SEQLEN);
inputStream[i].rightQuality = (char*) malloc (SEQLEN);

这些“malloc()”函数必须与 free() 配对。

关于C - 无法释放分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6745768/

相关文章:

c - C 循环中的 Malloc 和 Free

c++ - 为字符串 vector 预分配内存(C++ vector<string>)

android-studio - Android 工作室崩溃

c - 如何删除根节点作为完整树删除的一部分

c - 嵌套结构填充 - C - 64 位 - linux

c++ - LPCSTR 没有 'long' 并且 UINT_PTR 没有指针?

objective-c - 点符号解除分配?

objective-c - 寻找过度释放的根源

Java虚拟机多次崩溃

iphone - 在我的iPhone中安装时,PhoneGap应用程序崩溃。