我使用链表创建了一个图形数据结构。使用此代码:
typedef struct vertexNode *vertexPointer;
typedef struct edgeNode *edgePointer;
void freeGraph(vertexPointer); /* announce function */
struct edgeNode{
vertexPointer connectsTo;
edgePointer next;
};
struct vertexNode{
int vertex;
edgePointer next;
};
然后我创建一个图,其中有 4 个节点,比如说 A、B、C 和 D,其中:A 通过 B 连接到 D,A 通过 C 连接到 D。使用链表,我想它看起来像这样:
最后,我尝试使用 freeGraph(graph) 释放图形。
void freeEdge(edgePointer e){
if (e != NULL) {
freeEdge(e->next);
freeGraph(e->connectsTo);
free(e);
e = NULL;
}
}
void freeGraph(vertexPointer v){
if (v != NULL) {
freeEdge(v->next);
free(v);
v = NULL;
}
}
这就是 valgrind 开始抱怨“大小为 4 的无效读取”、“地址 0x41fb0d4 是大小为 8 的块内的 4 个字节 free'd”和“无效的 free()”的地方。它还说它做了8个mallocs和9个frees。
我认为问题在于节点 D 的内存已经被释放,然后我试图再次释放它。但是我看不出有任何方法可以在不改变数据结构的情况下做到这一点。
如果可能,无需更改数据结构,防止这些错误并正确释放图形的最佳方法是什么?此外,如果此代码有任何其他问题,请告知。谢谢!
问候,分号