gpt4 book ai didi

c - "pointer being freed was not allocated"内存块由于某种原因不会释放

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:20 25 4
gpt4 key购买 nike

我正在努力寻找无法释放内存块的原因。指针一定有问题。结构的内存块在函数中创建,使用的指针存储在数组中。稍后从数组中获取指针以用于释放内存。

我已经弄清楚它是免费的了。我在它旁边放了“//这个”。

#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;
}

感谢您的帮助。

最佳答案

new_var() 中你有(简化)

Variable ** new_var(){ //Makes new variable
Variable ** return_variable;
Variable * new_variable = malloc(sizeof(Variable));

return_variable = &new_variable;
return return_variable;
}

一旦函数结束,从该函数返回的值将失效。局部变量的地址仅在该变量存在时才有意义。

关于c - "pointer being freed was not allocated"内存块由于某种原因不会释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com