gpt4 book ai didi

c - 词频程序内存泄漏

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

我正在编写的 wf 函数中泄漏了非常少量的内存,而且我似乎无法准确找到它。我正在使用哈希表来保存频率,但我的测试使它看起来不在哈希函数中。这是我打开/读取文件并在最后释放数据的功能。我确定这是一个简单的错误,但我查看这段代码的时间太长了,以至于无法看到它。

typedef struct {
int noInFiles, numFiles, numToPrint;
char** fileNames;
FILE** files;
Hash hash;
} Freq;

void handleInput(int argc, char* argv[], Freq* freq) {
int num = 0, i, j = 0;
char* crap;

printf("memcurrent pre fileName alloc: %d\n\n", memCurrent());
freq->fileNames = calloc(argc - 1, sizeof(char**));
printf("memcurrent post filename alloc: %d\n\n", memCurrent());
freq->numToPrint = 10;

if(argc < 2) {
freq->noInFiles = 1;
freq->numFiles = 0;
return;
}

for(i = 1; i < argc; i++) {
if(argv[i][0] == '-') {
if(argv[i][1] == 'n') {
num = strtol(argv[i] + 2, &crap, 10);
freq->numToPrint = num;
}
else {
fprintf(stderr, "Usage: wf [-nX] [file...]\n");
exit(EXIT_FAILURE);
}
}
else {
freq->fileNames[j] = calloc(strlen(argv[i]) + 1 ,sizeof(char));
strcpy(freq->fileNames[j], argv[i]);
j++;
freq->numFiles++;
}
}
}

void openFiles(Freq* freq) {
int i;
char* str;

printf("Memcurrent pre open: %d\n",memCurrent());
freq->files = calloc(freq->numFiles,sizeof(FILE**));
printf("Memcurrent post open: %d\n",memCurrent());

for(i = 0; i < freq-> numFiles; i++) {
freq->files[i] = fopen(freq->fileNames[i],"r");
if(freq->files[i] == NULL) {
str = malloc(strlen(freq->fileNames[i]) + 5);
sprintf(str,"wf: %s",freq->fileNames[i]);
perror(str);
free(str);
exit(EXIT_FAILURE);
}
}
}

void freeFreq(int argc, Freq* freq) {
int i;

for(i = 0; i < argc - 1 ; i++) {
free(freq->fileNames[i]);
}
free(freq->fileNames);
free(freq->files);
}

哈希函数

typedef struct {
Entry* arr;
int size, numValid;
} Hash;

void initHash(Hash* hash) {
hash->arr = calloc(BASESIZE, sizeof(Entry));
TOTALALLOC =+ (BASESIZE * sizeof(Entry));
hash->size = BASESIZE;
hash->numValid = 0;
}

void freeTable(Hash* hash) {
int i;
for(i = 0; i < hash->numValid - 1; i++) {
if(hash->arr[i].correct == 1 && hash->arr[i].valid == 1) {
wordsFreed++;
free(hash->arr[i].word);
}
}
free(hash->arr);
}

最佳答案

可能是这样:

for(i = 0; i < hash->numValid - 1; i++) {

如果您在开始时将 numValid 设置为 0,我假设您每次向数组添加条目时都会递增它。

因此,如果 numValid 为 1,则您将永远不会循环,这意味着您将泄漏其中一个条目。似乎每次释放哈希时,都会泄漏一个条目,除非哈希根本没有条目。

关于c - 词频程序内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36962788/

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