你应该查看正在使用的libc中realloc()的源代码。从那里,很容易看出在可以原地增加大小时所遵循的路径,以及返回新指针的else情况。然后,使用它来编写自己的tryrealloc()函数。
例如,这是来自uclibc的realloc()源代码:
http://cristi.indefero.net/p/uClibc-cristi/source/tree/nptl/libc/stdlib/malloc/realloc.c
24 void *
25 realloc (void *mem, size_t new_size)
26 {
...
57 if (new_size > size)
58
59 {
60 size_t extra = new_size - size;
61
62 __heap_lock (&__malloc_heap_lock);
63 extra = __heap_alloc_at (&__malloc_heap, base_mem + size, extra);
64 __heap_unlock (&__malloc_heap_lock);
65
66 if (extra)
67
68 MALLOC_SET_SIZE (base_mem, size + extra);
69 else
70
72 {
73 void *new_mem = malloc (new_size - MALLOC_HEADER_SIZE);
74 if (new_mem)
75 {
76 memcpy (new_mem, mem, size - MALLOC_HEADER_SIZE);
77 free (mem);
78 }
79 mem = new_mem;
80 }
81 }
...
我已删除一些内容以使其更清晰。但是您可以看到在第66行,它检查是否可以简单地增加当前指针的内存。这是您想要保留的部分。从第69行开始的
else
情况是为了处理将释放旧内存并返回新指针的情况。这是您想要排除并以不同方式处理的部分。根据您的说法,我猜您只想删除第77行,它执行释放操作。
如果您选择这种方法,请记住,您必须手动释放旧指针或新指针,因为两者现在都有效(您不希望出现内存泄漏)。
此外,这是针对uclibc的。如果您已经使用不同的libc,则应该基于该libc的
realloc()
函数来构建新的
tryrealloc()
函数。
编辑:如果您采用此方法,必须小心。您将基于内存管理器的内部实现来构建解决方案,因此在各种libc实现之间以及相同libc的不同版本之间可能会有所不同。因此,请谨慎考虑并注意相关警告。
malloc()
之上执行大型分配,然后使用一组类似的函数在这些更大的分配中分配内存。基本上,管理自己的内存分配。然后,您可以按照自己的设计API,并仍然使其跨平台。 - Qix - MONICA WAS MISTREATED