프로그램을 하다 스스로 자주 실수하게 되는 코딩 스타일이 있습니다.
얼마전에 제가 자주 겪는 함정에 빠졌는데요. 관련 코드를 축약하면 아래와 같습니다.
CMyClass* pMy = NULL;
// 클래스 생성을 함수를 통해 대행
CreateMyClass(pMy);
// 아래 함수 호출하면 Crash!!
pMy->DoSomeghing();
// 잘못 만들어 진 함수
void CreateMyClass(CMyClass* pMy);)
{
pMy = new CMyClass;
ASSERT(pMy);
}
CreateMyClass() 라는 함수를 통해 CMyClass 의 생성을 대행하는 것이 목적이었는데, 주석으로 보이는 것과 같이 프로그램이 쉽게 죽어버렸습니다.
이상하게, 포인터를 가지고 작업하다 보면 이와 같은 실수를 자주 겪곤 합니다. (블로그에 실수를 다시 기록하는 것도 같은 실수를 반복하지 않기 위함이기도 하지요)
Call By Value 나 Call By Reference 를 떠나, 어찌 보면 명백한 오류인데, 포인터만 들어가면 요런 실수가 자주 일어나는건, 학부때 포인터 공부를 게을리했거나, 포인터를 최근에 거의 사용하지 않아서 그런가 봅니다.
포인터에 새로운 값을 할당하는 함수는 늘 그렇듯, 이중 포인터로 넘겨야 된다는 간단한 습관을 다시금 깨달았습니다.
CMyClass* pMy = NULL;
// 클래스 생성을 함수를 통해대행
CreateMyClass(&pMy);
// 제대로 수정한코드
void CreateMyClass(CMyClass** ppMy);)
{
(*ppMy) = new CMyClass;
ASSERT(*ppMy);
}
블로그에 부끄러운 실수를 올렸으니 담부터는 이러지 말기를 바랍니다 ㅎㅎ
'개발 > C C++' 카테고리의 다른 글
[C++]소멸자에서 가상함수 호출하기 (8) | 2008.10.08 |
---|---|
[C++]포인터 Wrapping 클래스 만들기 (4) | 2008.09.09 |
[C/C++] enum, 보다 나은 enum (19) | 2008.07.21 |
싱글톤 클래스 (5) | 2008.07.01 |
[C++]STL Container 조합하기 (5) | 2007.11.12 |
[C/C++]유용한 #pragma directive (9) | 2007.09.05 |
댓글