C - 无法释放分配的结构

C - Unable to free a malloced struct

我正在尝试用 C 语言创建一个简单的家谱程序,但是我遇到了一个问题,即以下结构的实例拒绝释放并且我遇到了内存泄漏

typedef struct Person {
    struct person* *parents[2];
    struct person* partner;
    struct person* *children[32];
} person;

包含它的伴随结构是这个

typedef struct Tree {
    person* top;
    person* current;
} tree;

Tree 结构释放得很好,但是当我尝试释放 person 结构的 malloced 内存时,我得到了内存泄漏,我很确定这表明内存。

void newPerson(tree *t){
    person *p = malloc(sizeof(person));
...

这是分配内存的函数

...
if (t->current){
t->top = p; 
t->current = p; 
...

在同一个函数中,两个指针都设置为指向 p。

int main(){
    tree *t = malloc(sizeof(tree));
    t->current = NULL;
    newPerson(t);
    free(t->current);
    free(t);
    return 0;
}

这是主函数中创建和释放树变量的代码。通过我尝试解决此问题的各种方法,发生了以下情况。

  1. 如果我将 free(p) 放在创建 Person 的同一函数中,一切正常,没有错误或内存泄漏
  2. 如果我尝试释放 t->current,我会收到一个泄漏消毒器错误,告诉我直接泄漏正是在分配 Person 的位置
  3. 如果我尝试释放 t->top,我会收到一个关于未知地址错误的 SEGV。

现在我知道问题出在 t 的某个地方,但我对问题到底是什么一无所知,我对 malloc 和 free 的了解已经退化到我做错事的地步,我可以没看到,或者有别的事情发生。

编辑:Reprex

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

typedef struct Branch {
    struct branch* otherbranch;
} branch;

typedef struct Tree {
    branch* root;
    branch* current;
} tree

void newBranch(tree *t){
    branch *b = malloc(sizeof(branch));
    b->otherbranch = NULL;
    if (t->current){
        t->root = b; 
        t->current = b; 
    }
    //free(b); //case 1 where freeing works
}

int main(){
    tree *t = malloc(sizeof(tree));
    t->current = NULL;
    newBranch(t);
    free(t->root); //case 3 where segv occurs
    //free(t->current); //case 2 where memory leak occurs
    free(t);
    return 0;
}

当您输入此代码时

void newBranch(tree *t){
    branch *b = malloc(sizeof(branch));
    b->otherbranch = NULL;
    if (t->current){
        t->root = p; 
        t->current = p; 
    }
    //free(b); //case 1 where freeing works
}

t->current 为空,因此您永远不会设置 t->root 或 t->current。

你然后return到main然后做free(t->root),此时t->root无效。您可能想将 t->root 初始化为 NULL,也许 t->current 也初始化

我还假设你的意思是 t->root = b 而不是 = p 因为我看不到 p