'c++'에 해당되는 글 3건

  1. 2008.03.31 Dodge, 뷃뗍, 총알피하기, 포인터 능엄경 (3)
  2. 2007.12.15 메모리가 주륵주륵
  3. 2007.06.13 C++ 추상 클래스와 포인터 캐스팅, 다중상속 ㅅㅂㄹㅁ (11)

Dodge, 뷃뗍, 총알피하기, 포인터 능엄경

프로그래밍 2008.03.31 10:25
사용자 삽입 이미지
Dodge.zip

(다운로드, Win32 바이너리)


 [8시간 내에 어떻게든 만들고야 말겠어!]
프로젝트 그 첫번째, 유명한 게임을 리메이크해보았습니다. 첫번째 8시간 프로젝트는 시간을 초과해버리고 말았습니다. 초반 4시간까지는 객체 설계나 기본 설계 까지는 빠른 속도로 진행가능했는데, 비트맵 뿌리는 부분에서 갑자기 주춤해서 시간이 너무 오래걸렸네요. (알고보니 오타 때문이었음.) 거기다가 펑크터 삽질에, 괜시리 최적화된 알고리즘이니 뭐니 생각해낸답시고 시간을 질질 끌다보니 어느덧 8시간을 넘어 10시간, 11시간. 절망했다!!

시간초과원인 분석
- functor 구현 시도에서 삽질 (결국 functor 포기)
- 적절한 탄환 배치 방법에서의 난항 (극좌표, 평면좌표를 헤매다가 적당한 눈속임 알고리즘으로 땜빵)
- 시간초과로 인한 졸음크리, 계속된 오타
- 속 안녕, 절망선생 13화

그리고 포인터 능엄경 [ 링크 ]

Trackbacks 0 : Comments 3

메모리가 주륵주륵

프로그래밍 2007.12.15 10:49
MFC에서 부득이한 경우로, vector 나 기타 메모리 관리 클래스를 거치지 않은 채로 동적할당을 이용해서 객체를 사용하던 중 문제가 발생했다. 동적할당한 객체를 가리키건 포인터를 delete 하거나, 동적할당을 반복하던 중에 포인터가 붕 떠버리는 (dangle) 현상이 일어난 것.

거기다 이 객체들이 다른 힙까지 침범을 하는 건지... 이상한 부분에서 오류가 발생하기도 하고, 포인터가 엉뚱한 곳을 가리키기도 하고, 그래서 delete 가 말을 듣지 않는 등 일대 패닉이 일어났다. (heap overrun)

내가 싸질러 놓은 객체의 생명주기 하나도 관리하지 못하는 걸까 하고 좌절했지만 결국 객체의 멤버 초기화 함수 Clear() 를 정의하여 delete 직전에 호출해주기로 했다.

하지만 여전히, 안된다.

동적 할당 부분을 추가한 걸로 봐선 아무래도 힙 문제일 가능성이 높다. OTL

Trackbacks 0 : Comments 0

C++ 추상 클래스와 포인터 캐스팅, 다중상속 ㅅㅂㄹㅁ

프로그래밍 2007.06.13 22:41
상황설명

A라는 부모 클래스를 만들고, 이 A라는 클래스의 포인터인 A* pA 를 인자로 하는 foo(A* pA)를 정의해서 사용중이었다. 이 함수의 인자로는 A를 상속한 B나 C클래스를 예상할 수 있으며, 이 B와 C클래스는 I라는 순수 가상함수를 상속한 다중상속 객체들이었다. I는 순수가상함수인 Vfoo()를 가지고 있었다. C는 생성자에서 A의 함수(가상함수가 아니다)를 호출한다.

사용자 삽입 이미지

이런 상속관계 (수정)


vector<I*> vt;

...

C* pC = new C;
I* pI = (I*)pC; // C* -> I*
vt.push_back(pI);

...

A* pA = (A*)vt[0]; // C* -> I* -> A*
foo(pA);

...

foo(A* p_pA)
{
    I* pI = (I*)p_pA; // C* -> I* -> A* -> I*
    pI->Vfoo(); // 여기서 문제발생
}

문제발생

문제는 C형 인스턴스를 가리키는 A형 포인터 pA_dir_C를 foo(A* pA)의 인자로 넘겨주면서 일어났다. foo(A* pA)함수 내부에서는 인자로 받은 pA를 (I*)pA 로 형변환하여 Vfoo()를 호출하는 루틴이 들어있었는데, 여기서 에러가 발생한 것이다. (6025 pure virtual function call)

Watch를 통하여 살펴보니 vftable의 문제였는지, Vfoo()가 아닌 엉뚱한 함수가 불려오더라. (다른 추상 클래스 I2에서 오버라이딩 된 가상함수였다.) 포인터 형변환에서 가상함수 테이블에 변화가 오는 것일까?

해결책

결국 C* -> I* -> A* -> I* 와 같은 여러 번의 형변환을 거치지 않고 C* -> I* 상태에서 pI->Vfoo() 식으로 형변환 단계를 줄여서 사용하였다. 정확히 말하면 문제를 해결한 것이 아니라 회피한 것이나 마찬가지다. 하지만 적당한 레퍼런스도 없고, 도와줄만한 사람도 없고 해서. 코드 길이는 좀 길어질지 몰라도 저런 식으로 함수를 통하는 단계를 줄여버렸다.

감상

쩐의 전쟁이 너무 재밌다.


Trackbacks 1 : Comments 11