술텀뱅이 블로그

after Normal Block error 본문

Language/C

after Normal Block error

우럭망둥이 2011. 3. 7. 11:48

ggtmuli9님의 블로그에서~

after Normal Block error 가 발생하는 이유는 다음과 같다.

after Normal Block error는 대부분 동적 할당 문제로 인해 발생된다.

동적 할당에서도 할당보다는 해재할때 일어 난다.

이를 이해하기 위해서는 동적 할당에 대해서 조금더 깊이 알아보자.

일단 동적 할당을 하면 우리가 원하는 만큼의 크기가 만들어진다.

하지만 컴퓨터는 정확한 크기를 알고있지 못한다.

그래서 그것을 인식시켜주기 위해서 우리가 만든 메모리 앞뒤로 Normal Block이란 놈이 존재한다.

앞의 Normal Block은 시작을 나타내고 뒤의 Normal Block은 끝을 알린다.

이를 before Normal Block, after Normal Block이라 한다.

이쯤 되면 after Normal Block error가 왜 생기는지 어렵풋이 짐작이 갈것이다.

이는 바로 after Normal Block값이 올바르지 못하다는 뜻인데...

그렇다면 언제 이런 에러가 발생 하는 것일까??

한번 알아보자

다음과 같은 코드가 있다.

char A[] = "abcd";
char *B = new char[5];
strcpy(A, B);
delete [] B;

이는 아무런 문제 없이 작동한다.

그 근거는 B가 참조하는 크기가 5고, 그 곳에 들어가는 크기도 5(NULL 까지 합쳐서 ...)이기 때문이다.

그래서 아무런 에러 없이 작동을 한다.

하지만 A의 크기가 5가 넘어 간다면...

이럴때 바로 after Normal Block error가 발생된다..

delete하는 시점에서...

그이유는 위에서 말한것과 같이 after Normal Block에 다른값이 들어 가버렸기 때문이다.

이는 직설적이기때문에 이런 실수를 하는 이는 그리 드물 것이다.

하지만 내가 이번에 이런 에러를 발생하게 된 원인은 바로 CString 에서 char* 로 전환시에 일어났다.

대부분 CString 에서 char*로 전환을 처음 하는 이들이라면 아래와 같이 생각하기 쉽다.

CString aaa = "abcd";
char * bbb = new char[aaa.GetLength()];
strcpy(bbb, (LPSTR)(LPCSTR)aaa);
delete [] bbb;

이와 같이 코딩을 한다면 after Normal Block error를 반드시 만나게 될것이다.

이유는 바로 CString의 문자열은 NULL문자를 포한하지 않는다는 것이다.

여기서 잠깐...

char의 문자열은 NULL문자를 포함하고 CString의 문자열은 NULL문자를 포함하지 않는다??

약간 햇갈리죠??

왜 그런지 한번 알아보자.

일단 NULL문자가 왜 있는지 부터 알아 보자.

NULL문자는 문자열을 처리하기 위해서 생긴 놈이다.

char형은 일단은 단순 문자형 변수이기에 문자 외에는 다른정보를 가질수었다.

하지만 char라는 문자형의 변수가 있었기에 char를 이용해서 문자열까지 표현하고 싶었다.

방법을 모색하다가 결국에는 NULL문자 여부로 문자열과 단일 문자를 판단하게 되었다.

즉 문자열 시작부분은 변수가 가지고 있고 끝부분은 NULL가 있는 곳으로 정의 되었다.

그렇기에 char형은 반드시 NULL이 포함되어야 했지만...

CStringClass로 정의 되어있다.

Class....특징중 가장큰것은 멤버 변수와 멤버 함수로 이루어져 있다는 것이다.

멤버 변수... 여기에 집중해보자...

멤버변수로는 어떤 형태의 값도 저장이 가능하다..

이로써 CString은 문자열뿐만 아니라 다른 정보도 같이 가질수 있게 되었다..

일단 CString는 기본으로 문자열을 제공하기에 단일 문자와 문자열의 판단이 필요 없으며

다음 멤버 변수로써 문자열의 길이를 저장할수있고 알수있다..

이런 기능을 할수있음으로써 구지 NULL문자를 이용하여 문자열을 판단할필요 없었다.

그래서 CString에는 NULL 문자가 없다.

여기까지가 CStringNULL문자가 없는 이유고.

다시 돌아가서...

CStringNULL가 없기에 위의 소스는 반드시 after Normal Block 자리에 NULL문자가 들어 가게 되어있다.
그래서 after Normal Block의 값이 변하고 after Normal Block error가 발생한다.

이를 방지하고 제대로된 작동을 원하면 아래와 같이 바꾸어 주자.

char * bbb = new char[aaa.GetLength()+1];

위와 같이 NULL문자가 들어갈수있는 공간을 확보해줌으로써 해결이 된다...

정말 유용한 정보야앙

'Language > C' 카테고리의 다른 글

ansi C 에 정의된 함수 목록  (1) 2011.03.07
strlen  (2) 2011.03.07
C의 여러가지 단어  (1) 2011.03.07
CallBack 함수란?  (3) 2011.03.07
배열 선언 오류  (2) 2011.03.07
Comments