gpt4 book ai didi

调用 free() 后内存未释放

转载 作者:行者123 更新时间:2023-12-04 00:10:16 25 4
gpt4 key购买 nike

我有一个简短的程序,它通过向链表添加节点来生成链表,然后释放链表分配的内存。

Valgrind 不报告任何内存泄漏错误,但进程继续持有分配的内存。

我只能在将分配的内存从 sizeof(structure_name) 更改为固定数字 512 后才能修复错误。(请参阅注释代码)

这是错误还是正常操作?这是代码:

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


typedef struct llist_node {
int ibody;
struct llist_node * next;
struct llist_node * previous;
struct llist * list;
}llist_node;

typedef struct llist {
struct llist_node * head;
struct llist_node * tail;
int id;
int count;
}llist;

llist_node * new_lnode (void) {
llist_node * nnode = (llist_node *) malloc ( 512 );
// llist_node * nnode = (llist_node *) malloc ( sizeof(llist_node) );
nnode->next = NULL;
nnode->previous = NULL;
nnode->list = NULL;
return nnode;
}

llist * new_llist (void) {
llist * nlist = (llist *) malloc ( 512 );
// llist * nlist = (llist *) malloc ( sizeof(llist) );
nlist->head = NULL;
nlist->tail = NULL;
nlist->count = 0;
return nlist;
}

void add_int_tail ( int ibody, llist * list ) {
llist_node * nnode = new_lnode();
nnode->ibody = ibody;
list->count++;
nnode->next = NULL;
if ( list->head == NULL ) {
list->head = nnode;
list->tail = nnode;
}
else {
nnode->previous = list->tail;
list->tail->next = nnode;
list->tail = nnode;
}
}

void destroy_list_nodes ( llist_node * nodes ) {
llist_node * llnp = NULL;
llist_node * llnpnext = NULL;
llist_node * llnp2 = NULL;
if ( nodes == NULL )
return;
for ( llnp = nodes; llnp != NULL; llnp = llnpnext ) {
llnpnext = llnp->next;
free (llnp);
}
return;
}

void destroy_list ( llist * list ) {
destroy_list_nodes ( list->head );
free (list);
}

int main () {
int i = 0;
int j = 0;
llist * list = new_llist ();

for ( i = 0; i < 100; i++ ) {
for ( j = 0; j < 100; j++ ) {
add_int_tail ( i+j, list );
}
}
printf("enter to continue and free memory...");
getchar();
destroy_list ( list );
printf("memory freed. enter to exit...");
getchar();
printf( "\n");
return 0;
}

最佳答案

如果“进程继续持有分配的内存”是指 ps 没有报告进程内存使用量减少,那是完全正常的。出于各种原因,将内存返回到进程的堆中并不一定会使进程将其返回到操作系统。如果你在一个大循环中一遍又一遍地创建和销毁你的列表,并且你的进程的内存使用量不会无限制地增长,那么你可能没有真正的内存泄漏。

[编辑添加:另见 Will malloc implementations return free-ed memory back to the system? ]

[再次编辑补充:顺便说一下,分配 512 字节的 block 使问题消失的最可能原因是您的 malloc 实现以某种方式特别对待较大的 block ,这使得它更容易它会注意到何时不再使用整个页面 - 如果它要将任何内存返回给操作系统,这是必要的。]

关于调用 free() 后内存未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365996/

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