我要推举的是<c interfaces and implementations: techniques for creating reusable software>, 任何程序都离不开分配内存, 下面一段代码来自随书的负责内存分配的代码:
///////////////mem.h
#ifndef mem_included
#define mem_included
#include "except.h"
extern const except_t mem_failed;
extern void *mem_alloc (long nbytes,
const char *file, int line);
extern void *mem_calloc(long count, long nbytes,
const char *file, int line);
extern void mem_free(void *ptr,
const char *file, int line);
extern void *mem_resize(void *ptr, long nbytes,
const char *file, int line);
#define alloc(nbytes) \
mem_alloc((nbytes), __file__, __line__)
#define calloc(count, nbytes) \
mem_calloc((count), (nbytes), __file__, __line__)
#define new(p) ((p) = alloc((long)sizeof *(p)))
#define new0(p) ((p) = calloc(1, (long)sizeof *(p)))
#define free(ptr) ((void)(mem_free((ptr), \
__file__, __line__), (ptr) = 0))
#define resize(ptr, nbytes) ((ptr) = mem_resize((ptr), \
(nbytes), __file__, __line__))
#endif
/////////////mem.c
static char rcsid[] = "$id: h:/drh/idioms/book/rcs/mem.doc,v 1.12 1997/10/27 23:08:05 drh exp $";
#include <stdlib.h>
#include <stddef.h>
#include "assert.h"
#include "except.h"
#include "mem.h"
const except_t mem_failed = { "allocation failed" };
void *mem_alloc(long nbytes, const char *file, int line){
void *ptr;
assert(nbytes > 0);
ptr = malloc(nbytes);
if (ptr == null)
{
if (file == null)
raise(mem_failed);
else
except_raise(&mem_failed, file, line);
}
return ptr;
}
void *mem_calloc(long count, long nbytes,
const char *file, int line) {
void *ptr;
assert(count > 0);
assert(nbytes > 0);
ptr = calloc(count, nbytes);
if (ptr == null)
{
if (file == null)
raise(mem_failed);
else
except_raise(&mem_failed, file, line);
}
return ptr;
}
void mem_free(void *ptr, const char *file, int line) {
if (ptr)
free(ptr);
}
void *mem_resize(void *ptr, long nbytes,
const char *file, int line) {
assert(ptr);
assert(nbytes > 0);
ptr = realloc(ptr, nbytes);
if (ptr == null)
{
if (file == null)
raise(mem_failed);
else
except_raise(&mem_failed, file, line);
}
return ptr;
}