gpt4 book ai didi

C - 无法释放分配的内存

转载 作者:太空宇宙 更新时间:2023-11-04 06:07:40 27 4
gpt4 key购买 nike

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

问题如下:可以丢弃大量生成的数据(由于冗余)以释放其内存。但即使调用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com