Computer Science/Etc

Visual Studio 디버깅에서 메모리 값 확인하기

TwinParadox 2018. 6. 27. 18:56
728x90

포인터, 변수의 주소에 대해서 그냥 책으로 그림만 그려가면서 공부하면

지나치게 추상적으로 받아들여지고 실제로 그렇게 작동하는지 의심을 할 수도 있다.

실체를 눈으로 보길 원하는 사람들에게 이건 반드시 그렇게 동작한다고 이야기하거나, 그냥 무작정 이렇게 돌아가니까 그런 줄 알고 활용만 잘하면 된다라고 하기보다는 직접 보여주는 게 좋은데, 비주얼 스튜디오(Visual Studio)의 편리한 디버깅 툴을 이용하면 어렵지 않게 실제 메모리에 어떻게 할당되는지 볼 수 있다.



#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
	string name;
	int sNo;
	void Print();
	static int studentNumber;
	static Student* CreateStudent(const string& name_arg);
private:
	Student(const string& name_arg, int stdNumber);
};
int Student::studentNumber = 0;
Student* Student::CreateStudent(const string& name_arg)
{
	Student* p = new Student(name_arg, studentNumber++);

	return p;
}
Student::Student(const string& name_arg, int stdNumber)
{
	name = name_arg;
	sNo = stdNumber;
}
void Student::Print()
{
	cout << "{Name = " << name << ", Std. Num. = " << sNo << "}\n";
}
int main(void)
{
	Student *p1, *p2, *p3;
	p1 = Student::CreateStudent("1");
	p2 = Student::CreateStudent("2");
	p3 = Student::CreateStudent("3");
	cout << "Hello";
}



위와 같은 소스가 있다고 하자.

C++ 입문자고, C언어에서 포인터가 메모리 주소 값을 가지고 있다는 사실만 알고 있는 사람이라면 Student*이라는 반환형에 대해 의문을 품을 수도 있다.



메모리를 뒤지지 않아도 개념이 잘 잡혀 있는 사람이라면 헷갈리지 않을 코드지만, 그래도 확실하게 보고 싶다면 조사식에 들어가는 값과 실제 메모리 주소 등을 뒤져볼 필요가 있다.



Visual Studio에서 디버깅을 시작(F5)을 하면 다양한 디버그 창을 띄울 수 있다.



주소값을 저렇게 절대 주소를 넣어서 찾을 필요는 없고, 메모리를 보고 싶은 변수를 입력하면 된다.

예를 들어, 동적 할당한 객체 p의 주소를 보고 싶다면 &p를

객체가 생성되고 나서 포인터 변수 p1, p2, p3의 값을 보고 싶다면 p1, p2, p3를 주소에 입력하면 알아서 해당 메모리를 보여준다.





위는 메모리 창, 아래는 변수값을 볼 수 있는 조사식 창으로 조사식 창에서 보는 포인터 변수의 값과 메모리 창에서 보는 값이 뒤집어져 있을 수 있다. 이는 리틀 엔디언 방식이기 때문에 그렇다.


이렇게 메모리를 뒤져가면서 디버깅을 해보는 것은 개인적으로 크게 도음이 됐다.

실제 메모리에 어떻게 동작하는지 알 수 있고, 포인터 변수에는 무엇이 담기는지 볼 수 있다. 그리고 객체가 생성되고 동적할당된 객체 앞 뒤의 값은 어떻게 채워지는지 알아나가면서 메모리와 동적 할당, 포인터에 대해서 한 층 더 깊게 이해할 수 있게 될 것이다.




728x90