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;
}
这是主函数中创建和释放树变量的代码。通过我尝试解决此问题的各种方法,发生了以下情况。
- 如果我将 free(p) 放在创建 Person 的同一函数中,一切正常,没有错误或内存泄漏
- 如果我尝试释放 t->current,我会收到一个泄漏消毒器错误,告诉我直接泄漏正是在分配 Person 的位置
- 如果我尝试释放 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
我正在尝试用 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;
}
这是主函数中创建和释放树变量的代码。通过我尝试解决此问题的各种方法,发生了以下情况。
- 如果我将 free(p) 放在创建 Person 的同一函数中,一切正常,没有错误或内存泄漏
- 如果我尝试释放 t->current,我会收到一个泄漏消毒器错误,告诉我直接泄漏正是在分配 Person 的位置
- 如果我尝试释放 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