malloc 메모리 free()해제 관련 질문 올립니다.
글쓴이: 익명 사용자 / 작성시간: 목, 2011/10/27 - 1:00오후
A라는 2차원배열 malloc메모리에 이미지를 넣어줍니다.
그다음 B라는 1차원배열 malloc에 A의 2차원이미지 malloc을 넣어주고,
B의 1차원배열을 연산작업을 한후 다시 A라는 2차원배열 malloc에 B의 1차원배열을 넣어줍니다.
그랬을 시!
메모리 해제를 해야하는데, A의 malloc 2차원배열 메모리해제를 하면 메모리읽기오류가 납니다.
1차원을 2차원으로 바꿔주는 부분에서 메모리 중복이 일어나서 에러가발생하는것 같은데,
어떻게 해야할지 잘모르겠습니다.
소스는 아래와 같습니다.
#include<stdio.h> void ReadImage(char *name,int **image,int width,int height); int **Imalloc2(int x,int y); void Ifree2(int **array, int x, int y); void WriteImage(char *name,int **image,int width,int height); void main() { int i,j; int width = 352,height = 288; int *input,*out; int **orgimg; orgimg = (int **)Imalloc2(width,height); input = ( int*)malloc(width*height*sizeof( int*)); out = ( int*)malloc(width*height*sizeof( int*)); ReadImage("bufimg.raw",orgimg,width,height); //two array converter one array for( i=0; i<width; i++) //352 for( j=0; j<height; j++) //288 input[j*width+i] = orgimg[j][i]; //algorithm main; for( j=0; j<height; j++){ for( i=0; i<width; i++){ if(input[j * width + i] < 113) out[j * width + i] = 0; else out[j * width + i] = 255; } } //one array converter two array orgimg[0] = out; for(i=1; i < 288; i++) orgimg[i] = orgimg[i-1] + 352; //블랙에어리어 강제삭제 for(j=0;j<20;j++) for(i=0;i<20;i++) orgimg[j][i] = 255; // 영상 인버터 for(j=0;j<height;j++) for(i=0;i<width;i++) if(orgimg[j][i] == 0) orgimg[j][i] = 255; else orgimg[j][i] = 0; Ifree2(orgimg,width,height); WriteImage("out.raw",orgimg,width,height); free(input); free(out); } void ReadImage(char *name,int **image,int width,int height) { FILE *fp; int i,j; fp = fopen(name,"rb"); if(fp==NULL){ printf("\n\t[] Open Failure !!"); exit(0);} for(i=0;i<height;i++) for(j=0;j<width;j++) image[i][j] = getc(fp); fclose(fp); } int **Imalloc2(int x,int y) { int i; int **tmp; tmp = (int **)malloc(sizeof(int *)*y); for(i=0;i<y;i++) tmp[i] = (int *)malloc(sizeof(int)*x); return(tmp); } void Ifree2(int **array, int x, int y) { int i,j; for(i=0;i<y;i++) free(array[i]); free(array); } void WriteImage(char *name,int **image,int width,int height) { FILE *fp; int i,j; fp = fopen(name,"wb"); if(fp==NULL){ printf("\n\t[] Open Failure !!"); exit(0);} for(i=0;i<height;i++) for(j=0;j<width;j++) putc((unsigned char)image[i][j],fp); fclose(fp); }
Ifree2(orgimg,width,height);를 주석처리하게되면 문제가 없지만 메모리가 해제가 되지않습니다.
하지만 주석을 없애주면 오류가 발생합니다.
1차원배열을 2차원 배열로 바꾸는부분에서 문제가 발생하는것 같습니다.
//one array converter two array orgimg[0] = out; for(i=1; i < 288; i++) orgimg[i] = orgimg[i-1] + 352; //블랙에어리어 강제삭제 for(j=0;j<20;j++) for(i=0;i<20;i++) orgimg[j][i] = 255;
도움부탁드립니다.
Forums:
작성자입니다. 이글에 대해 완료하였습니다.
작성자입니다.
이글에 대해 완료하였습니다.
..
위 코드를 이후에 orgimg[0] 과 out은 동일한 주소값을 가지게 됩니다.
그런데 그 이후에 orgimg[0]를 free 하구 다시 out을 free 하면 이미 메모리가 해제가 되었기 때문에 에러가 나는 것 같습니다.
그리고 위 코드에서 메모리 누수문제도 있는 것 같네요.
그래서 위 코드를 memcpy() 를 이용하도록 코드를 수정 해야될 것 같구요.
메모리 해제관련 에러와는 상관 없지만, 위 부분에서는 sizeof(int*) 을 sizeof(int)로 수정해야 의미가 맞을 것 같습니다.
-----
Do It Now!
댓글 달기