【发布时间】:2023-03-10 10:38:01
【问题描述】:
我的名为Table 的结构包含一个名为Object 的结构的数组。对象持有指向另一个Object 的指针。我想做两种方法——一种释放Object,另一种在给出指向这些结构的指针时释放Table(分别为ObjectP和TableP):
这是我当前的幼稚实现,它绝对行不通,因为 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));
...
}
【问题讨论】:
-
您看到的警告示例是什么?
-
能否请您说明如何分配它们?通常,删除对象应该涉及对
free的调用次数与构造对malloc的调用次数一样多 -
什么是
top?它是第一个元素吗? -
您是否尝试从整个表中单独删除对象?如果是这样,您将遇到一个主要问题,因为对于被删除列表中间的每个对象,都有一个先前的对象具有指向被删除对象的指针,该指针成为一个悬空引用。您确实需要找到该对象并将其下一个指针修复为指向被删除对象的下一个指针指向的对象。如果您只删除整个表,那么生活会轻松很多! (对不起双关语。)
-
@JonathanLeffler 只删除整个表 :)