Ошибка сегмента при освобождении несвязанных данных - PullRequest
0 голосов
/ 03 ноября 2018

Я создаю таблицу со связанными списками, в которой данные дублируются при передаче в методы вставки. Чтобы проверить это, я создаю массив со значениями, которые я вставлю, а затем вставлю их в таблицу. Когда я освобождаю массив, а затем освобождаю таблицу, я получаю ошибку 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]), программа выдает ошибку сегмента.

код для таблицы_выхода:

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

1 Ответ

0 голосов
/ 03 ноября 2018

бесплатные сегменты, как правило, означают двойную бесплатность, что означает, что вы пытались освободить то, что уже было бесплатным. или когда вы пытаетесь освободить указатель без malloc. есть ли malloc в функции data_create2?

если его нет, то вы пытаетесь освободить членов массива данных, где никогда не было бы malloc'd

...