gpt4 book ai didi

c - 如何释放这段 C 代码中分配的内存?

转载 作者:行者123 更新时间:2023-11-30 18:45:21 25 4
gpt4 key购买 nike

我正在我的代码上运行 valgrind,它表明我在使用 malloc 时没有释放内存。我试图释放它,但它给了我同样的信息。关于如何解决这个问题有什么建议吗?

谢谢!

/** 
* Read all the words from the given file, an return them as a
* linked list.
*/
Node *readWords( char *filename )
{
FILE *fp = fopen( filename, "r" );

if ( !fp ) {
fprintf( stderr, "Can't open file: %s\n", filename );
usage();
}

Node *list = NULL;

while ( true ) {
int ch = fgetc( fp );

while ( ch != EOF && ! wordChar( ch ) )
ch = fgetc( fp );

Node *n = (Node *) malloc( sizeof( Node ) );

int len = 0;
while ( wordChar( ch ) ) {
if ( len < WORD_MAX )
n->word[ len++ ] = toLower( ch );

ch = fgetc( fp );
}

n->word[ len ] = '\0';

if ( len == 0 ) {
return list;
}

n->next = list;

list = n;

free(n);
}

fclose(fp);
}

int main( int argc, char *argv[] )
{
if ( argc != 2 )
usage();

Node *list = readWords( argv[ 1 ] );
list = sortList( list );

reportWords( list );

while (list) {

Node *next = list->next;
free( list );
list = next;
}
return EXIT_SUCCESS;
}

这是我在列表中使用节点后释放节点的部分。

/** Insertion sort on a linked list. */
Node *sortList( Node *list )
{
Node *newList = NULL;

while ( list ) {

Node *n = list;
list = list->next;

Node **target = &newList;
while ( *target && strcmp( n->word, (*target)->word ) >= 0 )
target = &(*target)->next;

n->next = *target;
*target = n;
}

return newList;
}

这是进行排序的部分。

/** Given a sorted list, report the number of occurrences of each word. */
void reportWords( Node *list )
{
Node *n = list;
while ( n ) {
Node *end = n->next;
int ocount = 0;
while ( end && strcmp( n->word, end->word ) == 0 ) {
end = end->next;
ocount++;
}
printf( "%s (%d)\n", n->word, ocount );
n = end;
}
}

这是报告单词(打印出来)的函数。

最佳答案

您有两个主要问题,都在 readWords 中:

while ( true ) {
...
Node *n = (Node *) malloc( sizeof( Node ) );
...

if ( len == 0 ) {
return list;
}

n->next = list;

list = n;

free(n);
}

fclose(fp);

您填充一个节点,将该节点添加到列表中,然后立即释放该节点,使其无效。稍后,当您尝试读取该列表时,您调用 undefined behavior通过取消引用指向已释放内存的指针。您已经在 main 末尾释放了列表,因此无需在此处执行此操作。

这会给你留下一些悬而未决的内存泄漏。当到达文件末尾时,len == 0 检查为 true,因此您立即从函数返回。这会使您分配的最新节点(不包含任何内容)成为泄漏,并且您不会关闭 fp。您可以通过释放 if block 内的 n 并使用 break 退出循环,然后移动 return 来解决此问题fclose 之后的 语句。

while ( true ) {
...
Node *n = (Node *) malloc( sizeof( Node ) );
...

if ( len == 0 ) {
free(n);
break;
}

n->next = list;
list = n;
}

fclose(fp);
return list;

关于c - 如何释放这段 C 代码中分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55026252/

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