typedef struct partition_struct {
int* elements;
int last; //last element index
int dim; //n allocated int
} partition;
typedef struct partitions_struct {
partition* partitions;
int last; //last partition index
int dim; //n allocated partition
} partitions;
为什么当第二次从“free_ps”调用时,partition("free_p") 的 free 函数会在 free(p) 行上给出“munmap_chunk(): invalidpointer”错误?
void free_p(partition* p){
if(p==NULL) return;
if(p->elements) free(p->elements);
free(p); //<--Gives error here
}
void free_ps(partitions* ps){
if(ps==NULL) return;
for(int i=0; i<=ps->last; i++){
free_p(&ps->partitions[i]);
}
if(ps->partitions) free(ps->partitions);
free(ps);
}
有没有正确的方法来释放structpartitions_struct?
我尝试在释放分区结构时删除 free(p),但我担心内存泄漏 下面是正在运行的代码:
void free_ps(partitions* ps){
if(ps==NULL) return;
for(int i=0; i<=ps->last; i++){
free(ps->partitions[i].elements);
}
if(ps->partitions) free(ps->partitions);
free(ps);
}
内部功能参考:
partition* partition_factory(int size){
partition* new = (partition*) malloc(sizeof(partition) * 1);
new->dim = size;
new->elements = (int*) malloc(sizeof(int) * size);
new->last = -1;
return new;
}
partitions* partitions_factory(int size){
partitions* new = (partitions*) malloc(sizeof(partitions) * 1);
new->dim = size;
new->partitions = (partition*) malloc(sizeof(partition) * size);
new->last = -1;
return new;
}
void add_el_to_p(partition* p, int el){
if((p->dim)-1 == p->last){
int new_size = p->dim * 2;
int* new_elements = (int*)realloc(p->elements, new_size * sizeof(int));
if(new_elements==NULL) {
exit(1);
} else {
p->dim = new_size;
p->elements = new_elements;
}
}
p->last++;
p->elements[p->last] = el;
}
void add_p_to_ps(partitions* ps, partition* p){
if((ps->dim)-1 == ps->last){
int new_size = ps->dim * 2;
partition* new_partitions = (partition*)realloc(ps->partitions, new_size * sizeof(partition));
if(new_partitions==NULL) {
exit(1);
} else {
ps->dim = new_size;
ps->partitions = new_partitions;
}
}
ps->last++;
ps->partitions[ps->last] = *p;
}
free(p)
。不会出现内存泄漏(使用地址清理程序或 valgrind 或任何其他工具进行检查)。为了明白为什么会这样,想象一下这些功能:
struct int_array {
int* is;
int size;
};
free_int(int* i) {
free(i);
}
free_int_array(int_array* ia) {
for (int i = 0; i < ia->size; ++i)
free_int(&ia->is[i]);
free(ia->is);
free(ia);
}
你会说“当然这是完全错误的”,但你是绝对正确的。但这正是您在代码中所做的,只是将 int
替换为
partition_struct
。现在函数
free_p
实际上并没有释放
partition_struct
(也不应该),所以最好将其重命名为
cleanup_p
。