|
트랙백: [C/C++]자주 하는 실수: http://eslife.tistory.com/324 어떤 객체를 만드는 CreateObject라는 함수를 만든다고 하자. 그런데 생성된 객체를 리턴 값을 받는 것이 아니라 인자로서 받고 싶다. 그래서 아래처럼 코딩 해버렸다. // 잘못된 코드 C/C++ 포인터 관련해 저지르기 쉬운 실수 중 하나다. 오류는 쉽게 찾을 수 있을 것이다. object*가 아니라 object**를 넘겨 줘야 한다. 왜냐면 object*에 대한 내용을 고쳐야 하기 때문. C++ 같으면 object*&로 쓰면 되지만 보통 API는 C 인터페이스로 제공되는 것이 유리한 점이 많기 때문에 이런 경우는 많이 찾아 볼 수 있다. 대표적으로 예는 윈도우 프로그래밍에서 COM 관련 코드에서 많이 나온다. IUnknown의 QueryInterface 함수 원형은 아래와 같다. 함수 리턴 값은 통일된 반환 값으로 되어 있기 때문에 위와 같은 이중 포인터로 돌려 받고 그런다. HRESULT QueryInterface( 그런데 생각보다 적지 않은 사람들이 이런 이중, 혹은 삼중포인터에 헷갈려 하는 것 같다. 그런데 포인터를 읽을 때 아래와 같이 읽어보자. 그러면 절대 이중, 삼중, 사중, 오중 등등 포인터가 나와도 걱정 없다. object*object**object***즉, 맨 오른쪽의 *를 제외하고 왼쪽의 모든 것을 가려라. 거기에 아무리 * 기호가 더 있어도 무시해라. object**를 이중포인터 복잡하게 생각하지 말고 object*를 그냥 int 같은 하나의 타입으로 생각하면 된다. 여기에 대한 포인터일 뿐이다. 아래 같은 코드에서 int*를 int로 쓰는 실수는 거의 하지 않을 것이다. void sum(int a, int b, int* sum){마찬가지다. 위에서 실수한 CreateObject 코드에서도 object*를 하나의 타입으로 본다면 object*만 쓰는 실수를 범하지 않을 것이다. bool CreateObject(object** ppObj){추가: C++ new 연산자는 메모리가 부족할 때 NULL을 반환하지 않고 exception을 발생합니다. MSDN에 따르면 nothrownew.obj를 명시적으로 링크하면 throw를 하지 않는다고 합니다.
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04 저도 아들 돌잔치때 돌잡이 .. by 박상욱 at 01/18 미국 대학원 원서 작성중에 p.. by 태클사이야 at 01/13 TO: 박PD 로그인 하지 않아.. by 박응용 at 01/10 http://gigglehd.com/zbx.. by dhunter at 12/28 우와.. 좋네요. 태반이 .. by 윤광배 at 12/17 항상 좋은 글 잘 보고 있습니.. by y2k at 11/23 글이 좋아서 제 블로그에 담.. by 쏭섭 at 11/23 최근 등록된 트랙백
메뉴릿
이글루 파인더
|