首页 > 解决方案 > 释放不相关数据时的段错误

问题描述

我正在创建一个带有链表的表,其中数据在传递给插入方法时会重复。为了测试这一点,我创建了一个包含要插入的值的数组,然后将它们插入到表中。当我释放数组然后释放表时,我收到 SEG FAULT 错误。因此,我得出结论,两个结构中的指针必须指向同一个内存区域。但是,当我复制数据时,我看不出问题可能来自哪里......

这是测试的代码:

for(i=0; i<1024; i++) {
    key[i] = (char*)malloc(16*sizeof(char));
    sprintf(key[i],"a/key/b-%d",i);
    data[i] = data_create2(strlen(key[i])+1,strdup(key[i]));

    table_put(table,key[i],data[i]);
}

assert(table_size(table) == 1024);
result = (table_size(table) == 1024);

for(i=0; i<1024; i++) {
    d = table_get(table,key[i]);

    assert(d->datasize == data[i]->datasize);
    assert(memcmp(d->data,data[i]->data,d->datasize) == 0);
    assert(d->data != data[i]->data);

    result = result && (d->datasize == data[i]->datasize && 
                       memcmp(d->data,data[i]->data,d->datasize) == 0 &&
                       d->data != data[i]->data);
    data_destroy(d);
}

for(i=0; i<1024; i++) {
    free(key[i]);
    //data_destroy(data[i]);
}

table_destroy(table);

当我取消注释该 data_destroy(data[i]) 行时,程序会给出 Seg Fault。

table_put 的代码:

int table_put(struct table_t *table, char * key, struct data_t *value) {


if(table == NULL || key == NULL || value == NULL) return -1;



struct entry_t *new_pair = entry_create(key, value);



int i = key_hash(key, table->size);

int l = 0;
if (list_get(table->list[i], new_pair->key) == NULL) {
    l = 1;
}   

if(list_add(table->list[i], new_pair)==-1){

    entry_destroy(new_pair);
    return -1;
} 
table -> length = table -> length + l;

return 0;

}

代码:entry_create,我在其中复制数据:

struct entry_t *entry_create(char *key, struct data_t *data){
if(data == NULL || key == NULL){
    return NULL;
}
struct entry_t *entry = (struct entry_t *) malloc(sizeof(struct entry_t));
if(entry == NULL){
    return NULL;
}
entry->key = (char*) malloc(sizeof(strlen(key))+1);

memcpy(entry->key,key,strlen(key)+1);


entry->value = data_dup(data);


//free(key);
data_destroy(data);
return entry;
}

标签: csegmentation-faultfreedynamic-memory-allocation

解决方案


free 上的 segfaults 通常是 double free 的意思是你试图释放一些已经被释放的东西。或者当您尝试在没有任何 malloc 的情况下释放指针时。data_create2 函数上是否有任何 malloc ?

如果没有,您正在尝试释放从未 malloc'd 的数据数组成员


推荐阅读