怎么检测malloc失败?

pic*_*c11 28 c

检查是否malloc未能分配非零内存块的可移植方法是什么?

a3n*_*3nm 34

根据Single Unix规范,malloc将在失败时返回NULL并设置errno.

  • `errno`**是线程安全的**.不要听那些告诉你的人. (12认同)
  • 引文是XBD 3.396:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_396*流程中的单一控制流.每个线程都有自己的线程ID,调度优先级和策略,errno值,特定于线程的键/值绑定,以及支持控制流所需的系统资源.* (9认同)
  • C 标准不要求在 `malloc()` 失败时设置 `errno`,因此在一般情况下不能依赖它。 (3认同)

Swi*_*ift 16

我总是这样做:

tok = malloc( sizeof( char ) * ( strlen(tc) + 1 ) );

if( tok == NULL )
{
     /* Malloc failed, deal with it */
}
Run Code Online (Sandbox Code Playgroud)

有些人会这样做,tok = (type) malloc( ... )但是你应该投出结果,因为它显然掩盖了一些令人讨厌的错误.我会做一些研究,看看我是否能确切地知道它们是什么.

编辑:

施放malloc可以隐藏丢失的内容 #include <stdlib.h>

我发现此链接包含一个非常好的解释:

http://cboard.cprogramming.com/faq-board/25799-faq-casting-malloc.html

"所以当你说这个(char*)malloc(10)时

你说你接受任何malloc返回,将其转换为char*,并将其分配给相关变量.

如果malloc是正确的原型(通过包含stdlib.h),那么这一切都很好,它被定义为返回void*.

当您未能包含stdlib.h时,问题就出在了,并且编译器最初假定malloc返回一个int.真正的问题是,你不要从编译器得到任何警告.

然后,你快乐地将该int转换为char*(通过强制转换).在sizeof(char*)与sizeof(int)不同的机器上,代码严重破坏.

现在,如果你只有char*var = malloc(10); 你错过了包含,你会得到编译器的警告."

  • 除了这不是一个任意的数据类型,它是`char`,而`sizeof`是****的单位.根据定义,`sizeof(char)`是1,概念上它就像单位错误.无论如何,使用`sizeof*dest_ptr`是一种更好的做法,因为如果你将`dest_ptr`(这里是'tok`)的类型更改为其他东西,它会自动调整. (5认同)
  • 是的,使用`int`你需要乘以`sizeof(int)`.但同样,最安全的是直接从指向的类型的大小获取大小,即在您的示例中为`sizeof*tok`.然后,如果您更改类型并忘记更新`malloc`调用,则不会传递错误的大小. (5认同)
  • 你也应该避免写`sizeof(char)`.要么使用`sizeof*tok`,要么根本不使用任何东西. (4认同)

Dav*_*ard 7

您可以在以下时间检测故障

malloc(n) 回报 NULL

这是检测分配失败的最常见和最可靠的测试.如果你想在POSIX/SUS之外移动,我不会相信errno.如果你需要详细信息,比如记录,我会errno在通话前调零,看看它是否有变化,然后可能记录下来.

malloc(n)返回一个非NULL实际内存支持的非地址

触摸它,看看你是否被操作系统杀死了.是的,这可能发生.它被称为内存过度使用,类似于部分储备银行业务.这是操作系统或虚拟机管理程序将地址返回虚拟内存的乐观方法,这些虚拟内存是他们不必实际提供的赌博.这发生在Linux,VMware上.(我找不到Windows过度使用的任何明确证据,尽管请求的页面只有在被触及时才会"提交".)

接下来的问题是"我如何可靠地检测我的程序是否会因访问我从之前信任的malloc获得的地址而崩溃?" 一种方法可能是read()随机文件进入测试区域,看看操作系统是否返回EINVAL或等效.

加分,

malloc(0)返回NULL并离开errnoundefined

我知道问题是"非零[大小]内存块",但这很有趣.考虑一个SUS兼容的分配器,它打算NULL为零大小的分配返回非(它可以这样做),但随后它失败,所以它必须返回NULL.它可以尝试设置errno.这是失败吗?我认为Hoare说我们为这种模棱两可支付了10亿美元.所以,打电话malloc(0)不便携,提问者可能知道!


Ste*_*n C 6

当然.便携式方法是测试是否malloc(...)返回NULL.