다음 예제에서 메모리 해제 에러가 왜 생길까요?
아래와 같이 코딩하였다고 가정하겠습니다.
-------------------------------------------
#include <iostream.h>
int main()
{
char *i = new char[20];
i = "asfdsadfsdaf";
cout << i << endl;
delete i;
return 0;
}
--------------------------------------------
결과 출력 후, 확인하면 delete에서 Access Violation Error가 발생합니다.
이유는 무엇일까요?
char *i = new char[20];
위의 코드를 풀이해보면, 힙 영역 어딘가 char 형의 20 byte크기만큼 할당하고
할당한 것(정확하게 할당된 영역의 첫 주소값)을 포인터 i가 가리키는 형태입니다.
i = "asfdsadfsdaf";
위의 코드도 풀이하면, 메모리상 어딘가 존재하는 문자열 상수를 i가 가리키게 됩니다.
(여기서 할당된 메모리 위치를 이미 잃어버리게 됩니다. 다른곳의 주소를 가리키니까)
즉, i가 가리키고 있는 곳(new char[20])에 위의 문자열이 할당된게 아니라,
"asfdsadfsdaf"가 할당된 곳(초기화된 데이터 영역에 할당)의 첫주소를 가리키게 됩니다.
"asfdsadfsdaf"은 초기화된 데이터 영역(Initialized Data Segment)에 저장된 값은 일반 상수로
취급되며 쓰기는 불가능하고 오직 읽기만 가능합니다(.rdata 영역).
읽기가 가능하니 cout << i << endl; 하면 출력은 됩니다.
delete i; 라고 코딩되어 있는데,
결과적으로 i가 가리키는 곳은 초기화된 데이터 영역에 존재하는 "asfdsadfsdaf"이므로,
메모리의 특성상 쓰기가 불가능하니 Exception이 발생하는 것입니다.
strcpy(i, "asfdsadfsdaf"); 가 되는데,
이것은 "i가 가리키고 있는 주소값을 참조하여 문자열 상수를 그곳으로 복사해라"는 의미로,
i가 가리키는 영역은 (커널에게 정상적인 메모리 할당을 허락받은) Heap 영역이니 가능하죠.
※ 초기화된 데이터 영역(Initialized Data Segment)은 프로그램 종료시, 자동으로 해제됩니다.
Written By Sim-Hyeon, Choe