malloc 과 realloc을 피하고 가능한 한 new and zap(delete)을 많이 쓰도록 하자. 하지만 가끔은 "C++"에서 "C" 스타일의 메모리 얼로케이션을 써야할 필요가 있을 수도 있다. 함수 my_malloc() , my_realloc() and my_free()를 써라. 이 함수들은 allocations 과 initialisations을 적절히 하고 메모리 문제들을 방지한다. 또한 이 함수들은 (DEBUG 모드에서) 얼로케이트된 메모리를 추적하고 프로그램이 실행되기 전과 후의총 메모리 사용을 프린트한다. 이것은 여러분에게 메모리 유출이 있는지의 여부를 알려준다. my_malloc 과 my_realloc 은 아래와 같이 정의된다. 이것은 조금 더 많은 메모리(SAFE_MEM = 5) 를 할당하고 공간을 초기화한다. 그리고 만약에 프로그램안에 이미 할당이 되어 있으면 할당이 되지 않는다. 'call_check(), remove_ptr()' 함수는 오직 DEBUG가 makefile에서 정의 되었을때에만 작동이 되고 이 함수들은 ((void)0) ( 즉 NULL for non-debug production release.) 에 assigned 된다. 그들은 사용된 총 메모리를 추적하는 것을 가능케 한다.
void *local_my_malloc(size_t size, char fname[], int lineno)
{
size_t tmpii = size + SAFE_MEM;
void *aa = NULL;
aa = (void *) malloc(tmpii);
if (aa == NULL)
raise_error_exit(MALLOC, VOID_TYPE, fname, lineno);
memset(aa, 0, tmpii);
call_check(aa, tmpii, fname, lineno);
return aa;
}
char *local_my_realloc(char *aa, size_t size, char fname[], int lineno)
{
remove_ptr(aa, fname, lineno);
unsigned long tmpjj = 0;
if (aa) // aa != NULL
tmpjj = strlen(aa);
unsigned long tmpqq = size + SAFE_MEM;
size_t tmpii = sizeof (char) * (tmpqq);
aa = (char *) realloc(aa, tmpii);
if (aa == NULL)
raise_error_exit(REALLOC, CHAR_TYPE, fname, lineno);
// do not memset!! memset(aa, 0, tmpii);
aa[tmpqq-1] = 0;
unsigned long kk = tmpjj;
if (tmpjj > tmpqq)
kk = tmpqq;
for ( ; kk < tmpqq; kk++)
aa[kk] = 0;
call_check(aa, tmpii, fname, lineno);
return aa;
}
char *aa;
int *bb;
float *cc;
aa = (char *) my_malloc(sizeof(char)* 214);
bb = (int *) my_malloc(sizeof(int) * 10);
cc = (float *) my_malloc(sizeof(int) * 20);
aa = my_realloc(aa, sizeof(char) * 34);
bb = my_realloc(bb, sizeof(int) * 14);
cc = my_realloc(cc, sizeof(float) * 10);