gen*_*gen 7 c malloc error-handling runtime-error allocation
应该在每个malloc()之后检查它是否成功?malloc()是否有可能失败?那么会发生什么?
在学校我们被告知我们应该检查,即:
arr = (int) malloc(sizeof(int)*x*y);
if(arr==NULL){
printf("Error. Allocation was unsuccessful. \n");
return 1;
}
Run Code Online (Sandbox Code Playgroud)
有什么做法?我可以这样做吗:
if(!(arr = (int) malloc(sizeof(int)*x*y))
<error>
Run Code Online (Sandbox Code Playgroud)
Val*_*ity 14
这主要只是增加了现有的答案,但我知道你来自哪里,如果你做了大量的内存分配,你的代码最终看起来非常难看,因为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;
}
Run Code Online (Sandbox Code Playgroud)
这将至少确保您收到错误消息并清除崩溃,并避免所有大量的错误检查代码.
对于可能失败的函数的更通用的解决方案,我也倾向于实现一个简单的宏,如下所示:
#define PrintDie(...) \
do \
{ \
fprintf(stderr, __VA_ARGS__); \
abort(); \
} while(0)
Run Code Online (Sandbox Code Playgroud)
然后,它允许您运行以下功能:
if(-1 == foo()) PrintDie("Oh no");
Run Code Online (Sandbox Code Playgroud)
这为您提供了一个班轮,再次避免了批量,同时启用了适当的检查.
无需投放malloc()。是的,需要检查malloc()是否成功。假设malloc()失败,并且您尝试访问指针以为分配了内存会导致崩溃,因此最好在访问指针之前捕获内存分配失败。
int *arr = malloc(sizeof(*arr));
if(arr == NULL)
{
printf("Memory allocation failed");
return;
}
Run Code Online (Sandbox Code Playgroud)