OPは「多数のバッファが動的に割り当てられます...」とコメントしました。、malloc()
、realloc()
、などはcalloc()
、free()
サイズを格納するラッパー関数で書き直すことができます。
typedef union {
max_align_t align;
size_t sz;
} my_header;
void* my_malloc(size_t size) {
my_header *p = malloc(sizeof *p + size);
if (p) {
p->sz = size;
p++;
}
return p;
}
size_t my_size(const void *p) {
if (p) {
const my_header *head = p;
return head[-1].sz;
}
return 0;
}
void my_free(void *p) {
if (p) {
my_header *head = p;
free(--head);
}
}
他のすべての*.c ファイルは、いくつかの *.h ファイルを次のように呼び出します。
#define malloc my_malloc
#define free my_free
void *my_malloc(size_t size);
void my_free(void *p);
size_t my_size(const void *p);
今、割り当てられたポインターmy_sprintf()
で呼び出されると...
int my_sprintf (char *dest,char *format,...) {
va_list va;
va_start(va,format);
size_t n = my_size(dest);
return vsnprintf(dest,n,format,va);
}
さらに、渡されたポインターが本当に 1 であるかどうかを識別するために、マジック ナンバーmy_allcoated()
を前に追加することもできます。
割り当て関数をラップすることは、さまざまな割り当ての問題を判断する方法でもあります: 二重解放、最大使用量、すべてのポインターの解放など。
[編集] 5年後。
コードはアライメントを確保する必要があります - コードは作り直されました。
C11 より前のバージョンでは、 の代わりにワイド型の共用体を使用しますmax_align_t
。
typedef union {
double d;
long l;
void *p;
void (*fp)();
// With C99
complex long double cld;
long long ll;
size_t sz;
} my_header;