malloc 메모리 free()해제 관련 질문 올립니다.

익명 사용자의 이미지

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; 

도움부탁드립니다.

익명 사용자의 이미지

작성자입니다.
이글에 대해 완료하였습니다.

kdh0404의 이미지

	//one array converter two array
	orgimg[0] = out;

위 코드를 이후에 orgimg[0] 과 out은 동일한 주소값을 가지게 됩니다.
그런데 그 이후에 orgimg[0]를 free 하구 다시 out을 free 하면 이미 메모리가 해제가 되었기 때문에 에러가 나는 것 같습니다.
그리고 위 코드에서 메모리 누수문제도 있는 것 같네요.
그래서 위 코드를 memcpy() 를 이용하도록 코드를 수정 해야될 것 같구요.

	int *input,*out;
 
	input = ( int*)malloc(width*height*sizeof( int*));
	out = ( int*)malloc(width*height*sizeof( int*));

메모리 해제관련 에러와는 상관 없지만, 위 부분에서는 sizeof(int*) 을 sizeof(int)로 수정해야 의미가 맞을 것 같습니다.


-----
Do It Now!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.