gpt4 book ai didi

c - 简单程序的内存泄漏,我怎样才能释放分配?

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

我正在学习 C,并且在寻找如何释放我的 malloc() 时遇到了问题。

程序运行正确..但我正在使用 valgrind,它会产生 8 个分配和 5 个释放。我需要能够再释放 3 个。我评论了我认为我没有释放的地方,但我不确定解决方案。

有没有办法释放这些分配,或者我是否需要考虑重写 tokenizer()?

这是整个文件的代码。

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

char *substr(const char *s, int from, int nchars) {

char *result = (char *) malloc((nchars * sizeof(char))+1);
strncpy(result, s+from, nchars);

return result;
}

/**
Extracts white-space separated tokens from s.
@param s A string containing 0 or more tokens.
@param ntokens The number of tokens found in s.
@return A pointer to a list of tokens. The list and tokens must be freed
by the caller.
*/
char **tokenize(const char *s, int *ntokens) {
int fromIndex = 0;
int toIndex = 0;
char **list;
int finalCount = *ntokens;
int count = 0;

list = malloc(*ntokens * sizeof(char*));

while ( count < finalCount) {

char *m = strchr(s,' ');
toIndex = m - s;

if(toIndex >= 0) {
list[count] = substr(s,fromIndex,toIndex); // This substr() gets free'ed from main()
s = substr(s, toIndex+1, strlen(s)); // I believe This is where I am making extra mallocs that are not being freed
count++;
} else {
list[count] = substr(s,fromIndex,strlen(s)); // This substr() gets free'ed from main()
count++;
}
}

return list;
}

int main(int argc, char **argv) {
char **list;
char *string = "terrific radiant humble pig";

int count = 4; // Hard-Coded

list = tokenize(string, &count);

for (int i=0;i<count;i++) {
printf("list[%d] = %s\n", i, list[i]);
}

// Free mallocs()'s
for (int i=0;i<count;i++) {
free(list[i]);
}
// Free List
free(list);

return 0;
}

最佳答案

你不需要在获得一个 token 后每次都需要 substr 。就时间和空间而言,这太浪费了。您只需更改 s 的值,使其指向您需要的字符串即可。

//s = substr(s, toIndex+1, strlen(s));    // You don't need have to generate a new string
s = s + toIndex + 1;//You can just change the value of s to make it point to the string you need

关于c - 简单程序的内存泄漏,我怎样才能释放分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169946/

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