使用している 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 }
...
わかりやすくするために一部のパーツを削除しました。しかし、66 行目で、現在のポインターのメモリを単純に増やすことができるかどうかを確認していることがわかります。残しておきたい部分です。else
69 行目から始まるケースは、古いメモリが解放され、新しいポインタが返されるケースを処理するためのものです。これは、追い出して別の方法で処理したい部分です。あなたが言っていることから、無料を行う77行目だけを削除したいと思うでしょう。
このようにする場合は、古いポインターまたは新しいポインターのいずれかを手動で解放する必要があることに注意してください。これは、両方が有効になるためです (そして、メモリ リークは望ましくありません)。
また、これは uclibc 用です。すでに別の libc を使用している場合は、その libc の関数に基づいて新しいtryrealloc()
関数を作成する必要がありますrealloc()
。
編集:このアプローチを使用する場合は注意が必要です。メモリ マネージャーの内部構造に基づいてソリューションを作成するため、さまざまな libc 実装間だけでなく、同じ libc の異なるバージョン間でも状況が変化し、異なる可能性があります。したがって、適切な注意と警告を念頭に置いてそれを行ってください。