gpt4 book ai didi

c - 使用 free() 时大小为 4 的无效读取

转载 作者:行者123 更新时间:2023-12-02 09:32:13 24 4
gpt4 key购买 nike

我是 C 语言和 valgrind 的新手,正在尝试学习它们。当我使用以下功能时:

void die(const char *message,struct Connection *conn){
if (conn){
free(conn->file);
free(conn->db);
free(conn);
}
if (errno){
perror(message);
}else{
printf("ERROR:$s\n",message);
}
exit(1);
}

打印错误并从结构中释放内存(这是它们的声明):

struct Address{
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};

struct Database{
struct Address rows[MAX_ROWS];
};

struct Connection{
FILE *file;
struct Database *db;
};

我从 valgrind 得到了这样的错误:

==15471== 2 errors in context 61 of 62
==15471== Invalid read of size 4
==15471== at 0x4EA5889: _IO_default_setbuf (genops.c:567)
==15471== by 0x4EA4928: _IO_file_setbuf@@GLIBC_2.2.5 (fileops.c:454)
==15471== by 0x4EA6C32: _IO_unbuffer_write (genops.c:979)
==15471== by 0x4EA6C32: _IO_cleanup (genops.c:1019)
==15471== by 0x4E67F14: exit (exit.c:100)
==15471== by 0x40097F: die (ex17.c:33)
==15471== by 0x400DF4: Database_get (ex17.c:105)
==15471== by 0x40102F: main (ex17.c:139)
==15471== Addres 0x51d53f0 is 0 bytes inside a block of size 568 free'd
==15471== at 0x4C2845A: free (vg_replace_malloc.c:473)
==15471== by 0x40091D: die (ex17.c:25)
==15471== by 0x400DF4: Database_get (ex17.c:105)
==15471== by 0x40102F: main (ex17.c:139)

但是在没有 valgrind 的情况下执行时,我没有内存错误。会不会是NULL传给free()造成的?这真的是一个错误吗,因为有人说 free(NULL) 什么都不做?

抱歉英语不好。

最佳答案

如果您不是 libc,我不知道在什么情况下freeing FILE 指针是合法的,而您不是。无论您打算 free(conn->file); 表达什么意思,这绝对不是实现它的方法。

发生的事情是您释放了一些不属于您的内存,并且在退出时 libc 会自行清理打开的文件,并且崩溃,因为它触及了您已经毁掉的内存。

如果我不得不猜测,您可能指的是 fclose

关于c - 使用 free() 时大小为 4 的无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31857259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com