【问题标题】:Freeing a double pointer from a struct从结构中释放双指针
【发布时间】:2017-08-24 19:34:24
【问题描述】:

我的 delete_table 函数有问题。所以我有 2 个结构

struct _entry_ {
    int key;
    int data;
    struct _entry_* next;
    struct _entry_* prev;
};
typedef struct _entry_ entry;

struct _table_ {
    entry** entries;
    int size;
};
typedef struct _table_ table;

我用 calloc 初始化我的表。

void table_init(table* ht, int initial_size) {
    ht->entries = (entry**)calloc(initial_size, sizeof(entry*));
    if (ht->entries) {
        ht->size = initial_size;
    }
}

现在我写的免费函数

void table_destroy(htable* ht) {

    entry *el, *temp;
    int i;
    for(i = 0; i < ht->size; i++) {
      el = ht->entries[i];
      while(el != NULL){
        temp = el;
        el = el->next;
        free(temp);
      }
      free(ht->entries[i]);
    }
    free(ht); // <- don't know do i need this.
}

当我用 valgrind 测试它时,我得到了这个错误

==13560== Invalid free() / delete / delete[] / realloc()
==13560==    at 0x4C2BDEC: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13560==    by 0x400783: htable_destroy (htable.c:46)
==13560==    by 0x400A24: main (main.c:25)
==13560==  Address 0xffefffae0 is on thread 1's stack
==13560==  in frame #2, created by main (main.c:7)

任何帮助都会很棒,感谢您的宝贵时间!

【问题讨论】:

  • free(ht-&gt;entries); 在循环的末尾。而不是free(ht-&gt;entries[i]);
  • 你不一定有一个 NULL 指针数组,所以你知道 stackoverflow.com/questions/5857588/… 只是要考虑的事情。
  • @wildplasser 当然:​​/ 谢谢!

标签: c memory-management struct free calloc


【解决方案1】:
void table_destroy(htable* ht) {

    entry *del;
    int i;
    for(i = 0; i < ht->size; i++) {
      while( (del = ht->entries[i]) ) {
        ht->entries[i] = del->next;
        free(del);
      }
    }
    free(ht->entries);
    free(ht); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多