内存分配xmalloc()
和malloc()
之间的区别是什么?
是否有使用xmalloc()
的专家?
答案 0 :(得分:61)
xmalloc()
是一个非标准函数,其座右铭是成功或死亡。如果无法分配内存,它将终止您的程序并将错误消息打印到stderr
。
分配本身并没有什么不同;只有在没有内存可以分配的情况下的行为是不同的。
使用malloc()
,因为它更友好,更标准。
答案 1 :(得分:26)
xmalloc
不属于标准库。它通常是懒惰程序员非常有害的函数的名称,这在许多GNU软件中很常见,如果abort
失败则调用malloc
。根据程序/库的不同,它还可以将malloc(0)
转换为malloc(1)
,以确保xmalloc(0)
返回唯一指针。
在任何情况下,abort
malloc
失败都是非常糟糕的行为,特别是对于库代码。其中一个最臭名昭着的例子是GMP(GNU多精度算术库),它会在计算内存耗尽时中止调用程序。
正确的库级代码应该始终通过退出它在中间的任何部分完成的操作并将错误代码返回给调用者来处理分配失败。然后调用程序可以决定做什么,这可能涉及保存关键数据。
答案 2 :(得分:7)
K& R C中xmalloc.c的原始示例
#include <stdio.h>
extern char *malloc ();
void *
xmalloc (size)
unsigned size;
{
void *new_mem = (void *) malloc (size);
if (new_mem == NULL)
{
fprintf (stderr, "fatal: memory exhausted (xmalloc of %u bytes).\n", size);
exit (-1);
}
return new_mem;
}
然后在你的代码标题中(早期)放入
#define malloc(m) xmalloc(m)
在编译之前静默重写源代码。 (您可以通过调用来查看重写的代码 C预处理器直接并保存输出。 )
如果您的程序崩溃不是您想要的,您可以做一些不同的事情
用户不喜欢将数据丢失到程序中的内置崩溃命令中。
答案 3 :(得分:7)
xmalloc
是libiberty的一部分
https://gcc.gnu.org/onlinedocs/libiberty/index.html这是一个GNU utils库。
malloc
是ANSI C。
xmalloc
通常包含在许多重要的GNU项目中,包括GCC和Binutils,两者都使用了很多。但也可以将其构建为在程序中使用的动态库。例如。 Ubuntu有libiberty-dev
包。
xmalloc
记录于:https://gcc.gnu.org/onlinedocs/libiberty/Functions.html,GCC 5.2.0记录于libiberty/xmalloc.c
PTR
xmalloc (size_t size)
{
PTR newmem;
if (size == 0)
size = 1;
newmem = malloc (size);
if (!newmem)
xmalloc_failed (size);
return (newmem);
}
void
xmalloc_failed (size_t size)
{
#ifdef HAVE_SBRK
extern char **environ;
size_t allocated;
if (first_break != NULL)
allocated = (char *) sbrk (0) - first_break;
else
allocated = (char *) sbrk (0) - (char *) &environ;
fprintf (stderr,
"\n%s%sout of memory allocating %lu bytes after a total of %lu bytes\n",
name, *name ? ": " : "",
(unsigned long) size, (unsigned long) allocated);
#else /* HAVE_SBRK */
fprintf (stderr,
"\n%s%sout of memory allocating %lu bytes\n",
name, *name ? ": " : "",
(unsigned long) size);
#endif /* HAVE_SBRK */
xexit (1);
}
/* This variable is set by xatexit if it is called. This way, xmalloc
doesn't drag xatexit into the link. */
void (*_xexit_cleanup) (void);
void
xexit (int code)
{
if (_xexit_cleanup != NULL)
(*_xexit_cleanup) ();
exit (code);
}
正如其他人所提到的那样,非常简单:
malloc
exit
答案 4 :(得分:2)
我在IBM AIX上工作时遇到过xmalloc。 xmalloc是AIX提供的内核服务。
在我看来,没有什么能比函数的手册更好地解释一个函数了。所以我在手册页中粘贴了以下细节
目的:分配记忆。
语法:
caddr_t xmalloc(size,align,heap)
参数:
size:指定要分配的字节数。
align:指定已分配内存的对齐特征。
heap:指定从中分配内存的堆的地址。
说明
xmalloc内核服务从堆参数指定的堆中分配一个内存区域。此区域是size参数指定的字节长度,并在align参数指定的字节边界上对齐。 align参数实际上是所需地址边界的对数基数2。例如,对齐值为4请求分配的区域在2 ^ 4(16)字节边界上对齐。
内核提供了多个堆供内核扩展使用。两个主要内核堆是kernel_heap和pinned_heap。内核扩展在分配未固定的内存时应使用kernel_heap值,并且在分配应始终固定或固定很长一段时间的内存时应使用pinned_heap值。从pinned_heap堆分配时,xmalloc内核服务将在成功返回之前固定内存。当内存只应固定一段有限的时间时,应该使用pin和unpin内核服务来固定和解除kernel_heap堆中的内存。必须取消kernel_heap堆中的内存才能释放它。不应取消固定pinned_heap堆中的内存。
如果有兴趣了解有关此功能的更多信息,请访问以下链接: IBM AIX Support