C에서는, 메모리의 할당과 해제를 위해 malloc()과 free()를 비롯한 malloc()계열의 함수를 쓰지만, 다들 단점을 갖고 있다. 그래서 C++ 은 메모리를 다루기 위한 연산자들을 도입했고, 이들은 new 와 delete이다. 이 연산자들은 실행시에 힙(heap - 혹은 자유 공간)으로부터 메모리를 할당, 해제한다.
C++에서는 정말로 꼭 malloc()이나 free()만을 써야하는 상황이 아니라면 언제나 new 와 delete를 써야한다. 그러나 주의할 점은, 이 두 가지를 섞어서 쓰면 안된다는 것이다. malloc()으로 얻은 메모리를 delete로 해제할 수는 없고, 반대로 new로 얻은 메모리를 free()시킬 수도 없다.
9.1. C++ Zap (Delete) 함수
C++에서의 delete 와 new 연산자는 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함수의 예를 보아라.
'Computer Science' 카테고리의 다른 글
PIC의 활용 (PIC16F84, pic16f877) (0) | 2008.08.27 |
---|---|
MFC 주요 멤버 변수와 함수 (0) | 2008.08.26 |
XML 온라인 학습 [강좌] (0) | 2008.08.06 |
Flash 3D 관련 프로젝트 리스트 (0) | 2008.08.02 |
컴퓨터원격부팅-원격으로 컴퓨터를 on-off한다 (0) | 2008.08.02 |