是否应该在每个malloc()
之后检查它是否成功?malloc()
有可能失败吗?然后会发生什么?
在学校,我们被告知应该检查,即:
arr = (int) malloc(sizeof(int)*x*y);
if(arr==NULL){
printf("Error. Allocation was unsuccessful. n");
return 1;
}
这方面的做法是什么?我可以这样做吗:
if(!(arr = (int) malloc(sizeof(int)*x*y))
<error>
这主要只是增加了现有的答案,但我知道你来自哪里,如果你做了大量的内存分配,你的代码最终看起来非常难看,因为所有的错误检查都是针对malloc的。
就我个人而言,我经常使用一个永远不会失败的小malloc包装来解决这个问题。除非你的软件是一个有弹性的、安全关键的系统,否则你无论如何都无法有意义地解决malloc故障,所以我建议这样做:
static inline void *MallocOrDie(size_t MemSize)
{
void *AllocMem = malloc(MemSize);
/* Some implementations return null on a 0 length alloc,
* we may as well allow this as it increases compatibility
* with very few side effects */
if(!AllocMem && MemSize)
{
printf("Could not allocate memory!");
exit(-1);
}
return AllocMem;
}
这将至少确保您获得错误消息和干净的崩溃,并避免所有大量的错误检查代码。
对于可能失败的函数的更通用的解决方案,我也倾向于实现一个简单的宏,比如:
#define PrintDie(...)
do
{
fprintf(stderr, __VA_ARGS__);
abort();
} while(0)
然后允许您运行一个函数作为:
if(-1 == foo()) PrintDie("Oh no");
这给了你一个单一的班轮,再次避免散装,同时能够进行适当的检查。
无需强制转换malloc()
。是的,但是需要检查malloc()
是否成功。假设malloc()
失败,并且您试图访问指针时认为内存已分配会导致崩溃,因此最好在访问指针之前发现内存分配失败。
int *arr = malloc(sizeof(*arr));
if(arr == NULL)
{
printf("Memory allocation failed");
return;
}