gpt4 book ai didi

c - 正确释放结构的内存

转载 作者:太空狗 更新时间:2023-10-29 16:13:20 26 4
gpt4 key购买 nike

我的名为 Table 的结构包含一个名为 Object 的结构数组。 Object 持有指向另一个 Object 的指针。我想制作两种方法 - 一种释放 Object ,另一种释放 Table 当指向这些结构的指针时(ObjectPTableP 分别):

这是我目前的天真实现,它绝对不起作用,因为 valgrid 到处都是警告(我真的是来自 Java 的 c 新手):

/*
* Represents a linked list containing a key value
*/
typedef struct Object {
void *key;
struct Object *top;
struct Object *next;
Boolean originalCell;
} Object;

/*
* Represents a table that stores keys based on a given object's hash
*/
typedef struct Table{
Object *linkedObjects;
size_t size, originalSize;
HashFcn hfun;
PrintFcn pfun;
ComparisonFcn fcomp;
Boolean wasDuplicated;
} Table;

void FreeObject(ObjectP object)
{
free(object);
}

void FreeTable(TableP table)
{
free(table);
}

我应该如何正确释放这些结构?

编辑:

这就是我分配变量的方式:

ObjectP CreateObject(void *key)
{
struct Object *object = (struct Object*) malloc(sizeof(struct Object));
...
}

TableP CreateTable(size_t tableSize, HashFcn hfun, PrintFcn pfun, ComparisonFcn fcomp)
{
struct Table *table = malloc(sizeof(Table));

if (table==NULL)
{
ReportError(MEM_OUT);
return NULL;
}

table->linkedObjects = NULL;
table->linkedObjects = malloc(tableSize * sizeof(Object));
...
}

最佳答案

我不喜欢你的 ObjectPTableP 符号;我将使用 Object *Table * 使指针显式化。

从评论中,您只关心删除整个表;这很好,因为它比删除任意对象简单得多。

我假设 CreateTable()tableSize 参数存储在 table->size 中。

static Object *FreeObject(Object *obj)
{
Object *next = 0;
if (obj != 0)
{
free(obj->key); // If you allocated this
next = obj->next;
free(obj);
}
return(next);
}

void FreeTable(Table *tab)
{
if (tab != 0)
{
for (size_t i = 0; i < tab->size; i++)
{
Object *next = tab->linkedObjects[i].next;
while ((next = FreeObject(next)) != 0)
;
free(tab->linkedObjects[i].key); // If you allocated this
}
free(tab->linkedObjects);
free(tab);
}
}

FreeObject() 函数是静态的,因为它仅供 FreeTable() 使用。它删除键,假设在分配对象时分配了键;它捕获指向列表中下一项的指针(可能是空指针),释放对象本身,并返回指向下一项的指针。

FreeTable() 函数使用 FreeObject() 函数释放链接对象列表中的所有对象,这些对象卡在名为 的数组中分配的对象上linkedObjects,然后删除对象数组,然后删除表。

释放内存的关键是确保每次分配都有一个空闲,并且每次分配只有一个空闲。传递给 free() 的值必须是来自 malloc()calloc()realloc() 的值>。请记住,realloc() 可以更改先前分配的地址,但必须释放来自 realloc() 的值,而不是来自 malloc( )calloc()

关于c - 正确释放结构的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076369/

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