gpt4 book ai didi

c - 避免与内存分配相关的错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:17 26 4
gpt4 key购买 nike

我有一个复杂的 C 代码,在执行它时,我偶然发现了以下错误:

  1. glibc:损坏的双链表
  2. glibc:malloc() 内存损坏
  3. munmap_chunk() 无效指针

我意识到 1) 与释放已释放的内存有关。我仍在努力找出 2) 和 3) 的原因。

然后我做了一些搜索,得到的普遍意见是我必须使用“valgrind”进行调试以检测与内存损坏相关的问题。

好吧,言归正传,当我搜索这个论坛时,我刚刚挖出了一些发布在:What is the best way to free memory after returning from an error? 的代码。

这段代码解决了我的问题:

int func(void **mem1, void **mem2)
{
*mem1 = NULL;
*mem2 = NULL;

*mem1 = malloc(SIZE);
if(!*mem1)
goto err;

*mem2 = malloc(SIZE);
if(!*mem2)
goto err;

return 0;
err:
if(*mem1)
free(*mem1);
if(*mem2)
free(*mem2);

*mem1 = *mem2 = NULL;

return 1;
}

真正解决我问题的是这条线:

例如:

char *ptr = NULL;

ptr = (char *)malloc(SIZE);

assign and use ptr

free(ptr);

char *ptr = NULL 有什么帮助????事实上,当我一开始分配给 NULL 时,我什至没有使用 free(ptr)。它仍然很有效(我尝试执行了几次)

当我在开始时删除 NULL 分配时出现错误 1) :( :(

我将要安装 Valgrind,但在此之前我想了解一些相关信息。

谢谢

最佳答案

我会在黑暗中拍摄并猜测您尝试 free() ptr 指针 before 分配 malloc().

如果它已被初始化为NULL,大多数free() 实现什么都不做。来自free()手册页:

free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed.

如果它没有被设置为 NULL,那么您正在尝试释放一个随机指针,或者已经被释放的东西。

也就是说,Valgrind 在 POSIX 系统上正确检测此类错误的最佳工具。

编辑:

需要理解的是,C 不是 Java,它没有 VM 的奢华之处。一切都存在于相同的地址空间中,具有最少的保护 - 这包括内存分配器的结构。一旦发生与内存相关的错误,就无法预测它将如何让自己知道。

在其他两个错误中,乍一看我猜 (3) 再次与释放尚未分配的地址有关。然而,没有方法可以确定这确实是问题所在。一旦进程的内存损坏,您就不能相信它告诉您的关于它自己的任何内容 - 这就是本例中发生的情况。

只需使用适当的调试工具,如 GDB 或 Valgrind,即可避免您(和我们)盲目猜测的痛苦......

关于c - 避免与内存分配相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6545954/

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