본문 바로가기
Programming/Tips(C++,C#)

VC++. 디버그모드 메모리의 값의 의미

by 곰네Zip 2022. 7. 25.

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 

 

Magic number (programming) - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Sequence of bytes used to identify or indicate the format of a file In computer programming, the term magic number has multiple meanings. It could refer to one of the following: Unique

en.wikipedia.org

 

반응형

댓글