C++ 에서의 메모리 할당

C에서는, 메모리의 할당과 해제를 위해 malloc()과 free()를 비롯한 malloc()계열의 함수를 쓰지만, 다들 단점을 갖고 있다. 그래서 C++ 은 메모리를 다루기 위한 연산자들을 도입했고, 이들은 newdelete이다. 이 연산자들은 실행시에 힙(heap - 혹은 자유 공간)으로부터 메모리를 할당, 해제한다.

C++에서는 정말로 꼭 malloc()이나 free()만을 써야하는 상황이 아니라면 언제나 newdelete를 써야한다. 그러나 주의할 점은, 이 두 가지를 섞어서 쓰면 안된다는 것이다. malloc()으로 얻은 메모리를 delete로 해제할 수는 없고, 반대로 new로 얻은 메모리를 free()시킬 수도 없다.

9.1. C++ Zap (Delete) 함수

C++에서의 deletenew 연산자는 C의 malloc, free보다 낫다. 따라서 malloc과 free 대신 new와 zap(delete)를 쓰도록 하는 것이 좋다.

delete 연산자가 좀 더 깔끔하게 사용되게 하기위해 다음과 같은 Zap() inline 함수를 만들자. 다음과 같이 zap()을 정의하자.

// x가 NULL인지 체크하기 위해 assert를 사용하였다.// 이는 프로그램의 "논리적" 에러를 미리 잡아내기 위한 것이다.// delete가 NULL인 경우에도 잘 동작하긴 하지만, assert를// 사용함으로써 좀 더 일찍 에러를 잡아낼 수 있다.// Zap을 template을 사용하여 정의하자.// delete대신 zap을 사용하면 더 깔끔할 것이다.template <class T>inline void zap(T & x){	{assert(x != NULL);}	delete x;	x = NULL;}// C++에 두 가지 delete 연산자의 용법이 있는 이유는 C++ 에게// 한 객체에 대한 포인터와 객체의 배열에 대한 포인터를 구별하도록// 말해주는 방법이 필요하기 때문이다.// delete연산자는 프로그래머에게 "[]"를 쓰게함으로써 이를 구별한다.// 따라서 우리는 포인터의 배열을 지우기 위한 zaparr 함수를 다음과 같이 정의할 수 있다template <class T>inline void zaparr(T & x){	 {assert(x != NULL);}     delete [] x;     x = NULL;}

zap()함수는 포인터를 delete시키고 NULL로 세팅한다. 이는 똑같은 delete 포인터에 대해 여러번의 zap()이 불려서 프로그램이 망가지는 것을 방지한다. 다음의 zap_example()함수를 보아라. example_String.cpp 'Source code of C++'을 클릭해라.

	//  example_String.cpp에서 zap_example()를 보라.	zap(pFirstname);	//zap(pFirstname); // pFirstname이 NULL이므로 코어 덤프가 일어나지 않는다.	//zap(pFirstname); // pFirstname이 NULL이므로 코어 덤프가 일어나지 않는다.	zap(pLastname);	zap(pJobDescription);	int *iiarray = new int[10];	zaparr(iiarray);

뭐 특별한 것이 있는 것은 아니고, 이것은 단지 반복적인 코드를 줄이고 타이핑하는 시간을 아껴주며 프로그램을 좀 더 읽기 좋게 만들어주는 것 뿐이다. C++ 프로그래머들은 자주 delete한 pointer를 NULL로 세팅하는 것을 잊는다. 그리고 이는 코어덤프와 오작동으로 이어질 수 있다. zap()은 이러한 문제를 자동으로 처리해준다. zap()에 타입 캐스팅을 할 필요는 없다. 만약 위 zap()함수에서 에러가 난다면, 다른 데서 시작된 에러일 것이다.

또한 9.2절 , my_realloc() 과 my_free() 이 malloc(), realloc() 그리고 free() 대신 쓰여야 한다. 이들은 훨씬 깔끔하고, 여러가지 체크도 해준다. 예를들어, 9.2절 과 my_free() 함수를 사용하는 "String.h" 파일을 보라.

주의 : 'new'로 할당된 메모리를 해제하기 위해 free()를 쓰거나, malloc()으로 할당된 메모리를 해제하기 위해 'delete'를 쓰지 말아라. 그렇지 않으면 결과를 예측할 수 없는 에러에 빠질 것이다.

example_String.cpp 에서 'Source code of C++' 를 클릭한다음, zap함수의 예를 보아라.

+ Recent posts