【问题标题】:"pointer being freed was not allocated" Memory block will not deallocate for some reason“未分配被释放的指针”内存块由于某种原因不会释放
【发布时间】: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


【解决方案1】:

new_var() 你有(简化)

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

  return_variable = &new_variable;
  return return_variable;
}

一旦函数结束,这个函数返回的值就失效了。 局部变量的地址只有在该变量存在时才有意义。

【讨论】:

  • 谢谢你的回答。你说的对。它刚刚击中了我。除非分配,否则 new_variable 地址无效。我需要分配它。我现在就这样做......
  • 我分配了指向 new_variable 地址的指针,但我需要释放它。我不能在空池函数中这样做,因为这失败了 - free(var_pool->pool[x]);它应该是指向在 new_var() 的第一行创建的变量的已分配指针的指针的副本。
  • @Matthew - 或者...您可以将变量** 传递到新的 var 并执行类似 *newVar = malloc(sizeof(Variable)); 的操作
  • 起初我打算传递这样的指针,但后来我希望库的使用简单而优雅,所以我认为我应该让函数自己处理数据,只需要用户采取根据需要处理数据的引用。我现在对为什么当我将结构指针存储在池数组(三重指针之一)中时无法释放结构指针的内存块感到困惑。它只是指向已分配指针的 return_variable 指针的副本(它现在分配它,但不在上面的代码中。)
  • @Matthew:一旦你让它工作,试着摆脱全局变量。在main 中定义它们并将它们(或它们的地址:另一个*)传递给函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2019-03-13
相关资源
最近更新 更多