금일 이전에 만든 Rotating 이 되는 이미지 를 고속으로 FLTK 로 그리는 작업을 실행 중에 고속으로 메모리가 증가 하는 문제가 발생 했습니다. 이는 Fl_RGB_Image 의 생성시 unsigned char 형태의 array 로 생성 되는 경우, 참조되는 array 가 생성하는 쪽에서 제거를 해야 하는 형태로 만들어 지는 것을 간과 했기 때문 입니다.


Fl_Image.H 의 Fl_RGB_Image 생성자 부분을 보면,


    Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) :
    Fl_Image(W,H,D), array(bits), alloc_array(0), id_(0), mask_(0) {data((const char **)&array, 1); ld(LD);}


와 같이 되어 있으며, 이는 delete 로 Fl_RGB_Image 를 제거 하기 전에 alloc_array 와 array 를 비교하여 제거 해야 하는 이유가 됩니다.

그래서 다음과 같이 간단한 static function 하나를 만들어 쓰면 편리하게 제거가 가능합니다.


void remove_fl_rgb_image( Fl_RGB_Image* img )
{
    if ( img != NULL )
    {
        if ( ( img->alloc_array == false ) && ( img->array != NULL ) )
        {
            delete[] img->array;
        }

        delete img;
        img = NULL;
    }
}


이런 형태는 FLTK 구현에 따른 사항 이므로 이를 숙지하여 사용하는 것이 중요하며, 구현사항 이해의 미비점으로 memory leak 이 발생하는 것을 방지해야 겠습니다.



Posted by 견족자K rageworx