'Free'에 해당되는 글 1건

  1. 2016.05.31 [c 언어] 포인터의 free 시 런타임 에러 예제



아래 에러가 발생하였다. 무슨 상황일까?


"Invalid address specified to RtlValidateHeap"

( 참고로 프로그램 작성중 debug모드로 실행시 발행하는 메시지이며...)


( exe파일을 직접 실행할 경우... 아래의 메시지 팝업 창이 발생합니다.)

"프로그램이름.exe의 작동이 중지되었습니다."


포인터를 선언하고, malloc을 이용하여 heap 메모리 영역에 동적으로 메모리할당을 할 경우...

그 메모리를 다 쓴 경우 해제를 하여, 메모리의 낭비를 줄여야 한다.


이건 동적 메모리의 장점인데... 다만 메모리 관리를 하지 않으면, 실행하다가 메모리 부족으로

프로그램이 일정 시간이 지나면서 죽어버리는 문제가 발생한다.


바로 문제가 나올 수도 있고, 몇시간 또는 며칠이 될수 도 있다.


여하튼... 나도 간혹 실수하는 부분을 적어본다.


오늘의 내용은... 동적으로 할당한 메모리를 free할 때... 오류가 발생하는 상황을 설명하려 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main(void)
{
    int *currArr = NULL;
    int Arr[5= { 0,1,2,3,4 };
    int index, currSize = 5, newSize = 10;
    currArr = (int*)malloc(sizeof(int)*currSize);
 
#if 0
    currArr = Arr;   // make run time error : "Invalid address specified to RtlValidateHeap"
#else
    strcpy(currArr, Arr); // use string copy instead of address copy
#endif
    
    free(currArr);
    printf("Good ~ ! ");
}
 
cs


위의 내용을 보면, currArr을 동적으로 할당하여 5 x 4byte(int형의 크기) = 20 byte의 크기로 할당하고...

Arr 배열의 주소를 currArr에 넣어줬다. 

그리고 나서... free(currArr)을 할 경우..

다음과 같은 에러가 프로그램이 동작하는 도중에 발생한다. (Runtime Error)


"Invalid address specified to RtlValidateHeap"


이는 아마도... Arr라는 배열까지 free가 되려는 상황 같다.


이를 구분하기 위해 배열만 따로 선언하고, free를 해봤다.


1
2
3
4
5
6
7
8
void main(void)
{
    int *currArr = NULL;
    int Arr[5= { 0,1,2,3,4 };
    
    free(Arr);
    printf("Good ? ");
}

c


이 경우에 free(Arr)을 하는 순간 동일하게 런타임 에러가 발생했다.


이를 보면 이러한 상황을 피하기 위해서는 포인터에 배열의 주소를 대입하기 보단...

배열의 내용을 복사하기로 하는 것이 좋다.



1
2
3
4
5
6
7
8
9
10
11
12
void main(void)
{
    int *currArr = NULL;
    int Arr[5= { 0,1,2,3,4 };
    int index, currSize = 5, newSize = 10;
    currArr = (int*)malloc(sizeof(int)*currSize);
 
    strcpy(currArr, Arr); // use string copy instead of address copy
    
    free(currArr);
    printf("Good result");
}
cs


아까 위의 내용에서 안전한 코드만 다시 정리하였다.


이 시간 이후로...좀 고려할 내용으론... 배열과 포인터간 주소 대입을 한다면, malloc하지 않고

배열로 포인터를 초기화하는 방법도 있겠다.

그리고 물론 배열은 free를 하지 않는다고 나는 알고 있다.



1
2
3
4
5
6
7
8
void main(void)
{
    int *currArr = NULL;
    int Arr[5= { 0,1,2,3,4 };
    currArr = Arr;
    
    printf("Good result");
}
cs


Posted by 고무함지
,