Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc错误处理_C_Memory_Memory Management_Memory Leaks_Malloc - Fatal编程技术网

malloc错误处理

malloc错误处理,c,memory,memory-management,memory-leaks,malloc,C,Memory,Memory Management,Memory Leaks,Malloc,在使用malloc分配内存期间,除了内存不足之外,可能会发生哪些错误?处理这些错误的最佳策略是什么 对于内存不足异常,即使内存分配失败,也有必要释放指针吗?在C语言中没有异常(无论如何都不能在语言中使用),因此malloc发出失败信号的唯一方法是返回空指针。因此,您必须检查返回值。如果为0,则分配失败(无论出于何种原因),且未分配内存-无可用内存;否则,请求量(*)的分配成功,您将不得不在不再需要时释放内存 (*)注意溢出:malloc采用size\u t参数,该参数很可能是无符号数字。如果请求

在使用
malloc
分配内存期间,除了
内存不足之外,可能会发生哪些错误?处理这些错误的最佳策略是什么


对于
内存不足异常
,即使内存分配失败,也有必要释放指针吗?

在C语言中没有异常(无论如何都不能在语言中使用),因此
malloc
发出失败信号的唯一方法是返回空指针。因此,您必须检查返回值。如果为0,则分配失败(无论出于何种原因),且未分配内存-无可用内存;否则,请求量(*)的分配成功,您将不得不在不再需要时释放内存


(*)注意溢出:
malloc
采用
size\u t
参数,该参数很可能是无符号数字。如果请求的
size*sizeof(int)
字节具有无符号
size
且乘法溢出(可能是获取
size
值时出错),则结果是一个小数字
malloc()
将为返回的非空字节分配这一小部分字节,并根据
size
的实际(大)值索引到返回的数组中,可能会导致分段错误或其等效错误内存不足是唯一可检测到的错误。。。其他错误(如释放已释放的内存)可能会导致崩溃

在C中检查内存不足的一种策略是使用malloc和realloc(您可以称它们为xmalloc和xrealloc)的包装器来检查内存不足,如果是这样,则采取错误操作。。。打印消息并退出,或者可能尝试释放内存池,然后重试分配。这将所有测试放在一个地方,生成一致的失败消息,并确保检查所有分配尝试是否失败。下面的评论中讨论了可能的缺点

从历史上看,这种策略在C代码中很少见(这与用这种古老语言编写的代码中普遍存在的低质量一致),但现在一些成熟的库框架包含了这种东西(尽管实现留下了一些需要的东西;同样,请参见下面的注释)。另一种非常可取的方法是放弃C语言,转而使用更现代的语言。。。可能是C++,其中任何代码的失败>新< /代码>导致<代码> BADYOLLC/<代码>异常。
至于你的问题。。。如果malloc失败,则返回NULL;没有指向free的指针。(free(NULL)是一个no op)。如果realloc失败,则原始分配保持不变。您可以通过阅读手册页或规范(如

等)来了解这些信息。我知道这看起来像一个产品插头,但您可以在我们的writeup中了解各种内存分配错误,这是一种查找内存管理错误的工具,包括这些分配错误。

您能更具体地说明一下吗overflows@AmanAttila可能是指在分配的缓冲区末尾之外写入,这可能会覆盖malloc的控制信息,导致分配失败或任意未来malloc或free的崩溃。。。好吧,我想不是。。。但更新中描述的实际数字溢出比出于其他原因覆盖缓冲区要少得多,例如忘记将数组中的对象数乘以它们的大小,或者在分配一个foo数组时使用sizeof(*foo)而不是sizeof(foo):现实生活比这更糟:在标准Linux上,您的
malloc
调用可以成功,但内存实际上不可用,进程将被终止。默认情况下,操作系统会超额订阅内存。这通常不是什么大问题。谢天谢地,任何希望Linux系统比Win95表现更好的人都可以很容易地修复此默认设置。。。(
echo“2”>/proc/sys/vm/overmit_memory
)-1 malloc
的包装是一种极其有害但普遍的编程实践,需要废除。这是无法回避的——您必须处理
malloc
的失败,并且没有“更简单”的方法可以通过包装器来处理它。只中止程序的包装器使得编写不检查
malloc
故障(因为它可以假设包装器从不返回故障)的中断代码变得很容易,并且几乎不可能修复/恢复这些中断代码,使其在健壮的软件中可用。像GMP和glib这样的主要图书馆都受到这个问题的困扰。这是一个荒谬的自以为是的咆哮,它严重夸大了事实,并且与你自己的答案相矛盾。。。对最佳实践有不同意见是一回事,但是你的-1是不必要的。包装器可以做的一件事就是发出信号。如果这是“非常有害的”,那么C++也会提高BADYOLL异常,而不是从“NEW”中得到空返回。当然,它不是“极其有害的”。代码包含p=malloc(…);如果(!p)oom();与包含p=xmalloc(…)的代码不同,修复/修复并不容易,因此您的rant中没有任何声明是真实的,除了关于GMP和glib的投诉之外,但是这些库可以被修改以捕获和传播一个longjmp(我的意思是“信号”),使它们自己处于一个干净的状态。即使有些人缺乏知识或想象力,也可以在内存故障时使用异常编写健壮的软件。无论如何,如果你编辑你的答案,让我删除-1,我会的。我欠你一个人情,因为我在另一个问题上找到了同样糟糕的答案。。。