VC++에서 디버그모드에서만 해당된다. (릴리즈는 해당안됨. 그리고 이 메모리 주소는 VisualStudio를 사용해서 VC++라고 할뿐 C++에는 다 해당되는 이야기)
메모리 주소에 값이 들어가있다. 이 의미는? 어느 주소를 바라볼지, 어느값이 들어가있는지가 의미지..
하지만, VC++디버그 모드에서는 특정한 메모리에 대해서는 특정한 값으로 메모리 상태를 알려준다.
Release에서는 괜찮은데 Debug시에만 Access Violation이 발생하는경우라면.. 메모리 상태값이 들어가서 발생하는경우다. (사실 위험한 코드인건데 Release에서는 운좋게 프로그램이 살아남았다고 보면 된다.)
예를들어.. 다음과 같은 코드를 보자..
public CString myClass::GetName(){
CString result = "hello";
return result;
}
public void main(){
myClass mc = new myClass();
printf(mc.GetName());
}
위와 같이 구현했다고 하자.. release에서는 hello가 찍히지만 debug에서는 0xC0000005를 만날 수 있다. 아니면 글자가 깨져서 나온다.
해당 string의 메모리주소로 가면.. 그 주소에 쓰인 값은 0xfeeefeee일것이다.
해당 값은 힙에서 제거된 메모리 영역을 나타내는 상태값이다. 값의 의미는.. '여기 주소는 제거되었습니다.'임.
GetName()에 진입하여 result의 영역을 잡고, 그곳에 hello라는 문자열을 할당해주었다.
근데 GetName()메소드를 빠져나가면 영역들을 정리해야겠지?
그러면 result가 Hello를 담아두었던 공간은 제거되었기에 메모리 주소는 0xfeeefeee로 채워진다.
이런 코드값도 알아두면 꽤나 디버깅시 유용하다.
주소 값 | 의미 |
0xfeeefeee | 힙에서 메모리가 제거되었습니다. |
0xcccccccc | 초기화되지 않은 스택 메모리입니다. |
0xcdcdcdcd | 초기화되지 않은 힙 메모리입니다. |
전체 코드를 보려면 아래 링크 참조.
코드 정리 : https://en.wikipedia.org/wiki/Magic_number_(programming)#Debug_values
댓글