c - 释放不相关数据时的段错误
问题描述
我正在创建一个带有链表的表,其中数据在传递给插入方法时会重复。为了测试这一点,我创建了一个包含要插入的值的数组,然后将它们插入到表中。当我释放数组然后释放表时,我收到 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;
}
解决方案
free 上的 segfaults 通常是 double free 的意思是你试图释放一些已经被释放的东西。或者当您尝试在没有任何 malloc 的情况下释放指针时。data_create2 函数上是否有任何 malloc ?
如果没有,您正在尝试释放从未 malloc'd 的数据数组成员
推荐阅读
- python-2.7 - 编写代码,从两个单独的列表中按顺序打印出值
- python - 根据另一列的数据更改时区
- maxima - 如何正确使用`block`功能
- python - 试图摆脱嵌套列表中元素的逗号
- azure-devops - 使用 devops 多阶段管道部署时出错
- ssl - openssl输出主题行中的加号(+)是什么意思?
- google-apps-script - 如何使用 Google Photos API 方法:Google Apps 脚本中的 mediaItems.search 用于电子表格
- java - Android Java - 在应用程序窗口打开之前以编程方式捕获背景
- google-sheets - 创建用于将数字拉到 SUM 的动态工作表单元格参考列表
- ssl - 如何在 MTLS 身份验证中动态加载新的客户端证书