我正在创建一个带有链表的表,在将数据传递给插入方法时,这些表将被复制。 为了测试这一点,我使用将要插入的值创建一个数组,然后将它们插入表中。当我释放数组然后释放表时,我收到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;
}
答案 0 :(得分:0)
segfaults在free上通常是double free,意味着您已经尝试释放已经被freed的东西。或者当您尝试释放没有任何malloc的指针时。 data_create2函数上有任何malloc吗?
如果没有,您尝试释放从未分配过的数据数组成员