다음 이전 차례

5. my_malloc 과 my_free의 사용

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;
}

my_malloc 프로그램의 full implementation 을 위해서 my_malloc.cpp. 와 헤더 화일 my_malloc.h. 을 보라. my_malloc 과 my_free 사용예는 다음과 같다.


        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);

my_realloc 에서는 변수 자체가 전달되고, 정확한 my_realloc 이 불려지기때문에 (즉 적절한 데이타 타입 포인터가 반환되기때문에) 데이타타입을 변환할 필요가 없다는 것을 주지하라. my_realloc은 char*, int* 그리고 float*를 위한 중복된(overloaded) 함수들을 갖고 있다.
다음 이전 차례