【发布时间】:2011-04-11 08:33:30
【问题描述】:
我正在努力寻找为什么我无法释放内存块。指针一定有问题。结构的内存块在函数中创建,使用的指针存储在数组中。稍后从数组中取出指针用于释放内存。
我已经弄清楚它是哪个免费的。我在它旁边放了“//这个”。
#include <stdlib.h>
typedef enum {
INT = 0,
FLOAT = 1,
STRING = 2,
NONE = 3,
BOOL = 4
} TYPE;
typedef struct {
TYPE type;
void * data;
} Variable;
typedef Variable ** var; //Convenience typedef for pointer to variable pointer
typedef struct {
size_t size;
Variable *** pool; //Pointer to the array of pointers to the Variable structure pointers. Pointer required for memory allocation and array consists of pointers to pointers so the pointers to the Variable structures can be changed throughtout different functions.
} VarPool; //Variable pools will just be used to deallocate all variables at the end of a scope
VarPool * global_pool; //Pool for global scope
VarPool ** pool_stack; //Keeps track of pools in stack
unsigned int pool_stack_size;
void init_pool_stack(){
pool_stack = malloc(sizeof(VarPool *)); //Start with global_pool
pool_stack_size = 1;
global_pool = malloc(sizeof(VarPool));
pool_stack[0] = global_pool;
global_pool->pool = NULL;
global_pool->size = 0;
}
Variable ** new_var(){ //Makes new variable
Variable ** return_variable;
Variable * new_variable = malloc(sizeof(Variable));
VarPool * var_pool = pool_stack[pool_stack_size-1]; //Current variable pool on top of stack
var_pool->size++;
var_pool->pool = realloc(var_pool->pool,var_pool->size*sizeof(Variable **));
return_variable = &new_variable;
var_pool->pool[var_pool->size - 1] = return_variable;
return return_variable; //Return pointer to new pointer so pointer can be changed to NULL when deleted
}
void empty_pool(){ //Frees all data from variable pool
VarPool * var_pool = pool_stack[pool_stack_size-1]; //Current pool on top of stack
for (int x = 0; x < var_pool->size; x++) {
free(*var_pool->pool[x]); //Free variable data
}
free(var_pool->pool); //Free pool variable array
free(var_pool); //This one
pool_stack_size--;
pool_stack = realloc(pool_stack, pool_stack_size*sizeof(VarPool *));
}
int main (int argc, const char * argv[]) {
init_pool_stack();
new_var();
empty_pool(); //Finally empty globals pool which will deallocate pool_stack
return 0;
}
感谢您的帮助。
【问题讨论】:
-
Variable *** pool哎呀! 你确定你需要指向结构指针的指针吗?每个指针都需要一个malloc()和一个free()。 -
你对它运行过 valgrind 吗?
-
@pmg - 在达到指针禅之前,这就是发生的事情;)
-
三重指针用于有一个可变长度数组(第一个指针)指向一个结构指针。需要结构指针来为结构分配内存,并且需要指向该指针的指针来修改结构指针。这将发生在另一个与此问题无关的函数中,该函数将释放结构并将指针更改为 NULL。
-
该死的。我以为我掌握了指针。我的立场是正确的。
标签: c pointers memory-management malloc