a3n*_*3nm 34
根据Single Unix规范,malloc将在失败时返回NULL并设置errno.
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); 你错过了包含,你会得到编译器的警告."
您可以在以下时间检测故障
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)不便携,提问者可能知道!
| 归档时间: |
|
| 查看次数: |
46814 次 |
| 最近记录: |