que*_*en3 7 c c++ linux gcc realloc
我想使用realloc来增加内存大小,同时保持指针不变(因为调用者使用它).realloc并不总是如此; 有时它返回一个不同的指针并释放旧的指针.我想"尝试"重新分配内存,如果不可能,使用原始指针回退到另一个方法 - 但realloc已经破坏了!
有没有办法尝试增加malloc的内存而不破坏(作为realloc)旧指针,如果它不可能?
例如
void *pold;
void *pnew = realloc(pold, newsize);
if (pnew != pold)
{
free(pnew);
DoDifferently(pold); // but pold is freed already
}
Run Code Online (Sandbox Code Playgroud)
PS我不关心可移植性(仅限linux,因此标签).
您应该从您正在使用的 libc 中查看 realloc() 的源代码。从那里,应该很容易看到当它可以增加适当大小时遵循的路径,以及否则将返回新指针的情况。然后,使用它来编写您自己的 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 /* Grow the block. */
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 /* Record the changed size. */
68 MALLOC_SET_SIZE (base_mem, size + extra);
69 else
70 /* Our attempts to extend MEM in place failed, just
71 allocate-and-copy. */
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 }
...
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我删除了一些部件。但您可以看到,在第 66 行,它检查是否可以简单地增加当前指针的内存。这是您要保留的部分。这else是处理旧内存将被释放并返回新指针的情况。这是您想要踢出并以不同方式处理的部分。根据你所说的,我猜你只想删除第 77 行,它在其中执行 free。
如果您采用这种方式,请记住您将必须手动释放旧指针或新指针,因为两者现在都有效(并且您不希望内存泄漏)。
另外,这是针对 uclibc 的。如果您已经在使用不同的 libc,则应将新tryrealloc()函数基于realloc()该 libc 的函数。
编辑:如果使用这种方法,您必须小心。您的解决方案将基于内存管理器的内部结构,因此在不同的 libc 实现之间以及同一 libc 的不同版本之间,情况可能会发生变化并有所不同。因此,请牢记适当的谨慎和警告。
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |