没有struct 1和struct 2数组,struct 2内部有一个int数组

问题描述 投票:0回答:1
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; }
    
c pointers memory-leaks free dynamic-arrays
1个回答
0
投票
是的,有一个正确的方法。只需删除有问题的

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

© www.soinside.com 2019 - 2024. All rights reserved.