gpt4 book ai didi

c - 我应该检查 malloc() 是否成功吗?

转载 作者:太空狗 更新时间:2023-10-29 17:15:51 24 4
gpt4 key购买 nike

是否应该在每个 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");

这为您提供了一个衬里,再次避免了散装,同时启用了适当的检查。

关于c - 我应该检查 malloc() 是否成功吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26831981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com