|
ㅡㅡ;;
만해아주씨는 DBS 2006 이라던데 바로 에러뜨더라던..
김상구.패패루 님이 쓰신 글 :
: 수야야.. 뭐 이딴걸 가지고 고민을 해... 명명 백백 잘못된 코드인걸...
: 메모리 메니저가 개입되기 때문... 아무 문제 없었던건 운이 좋았던거고 걍 코드가드 돌려봐 바로 잡혀..
:
:
: 수야!╋ 님이 쓰신 글 :
: : 수야!╋랍니다.
: :
: : C++ 근간이 흔들리는 사태를 발견하여 이렇게 질문하게 되었습니다.
: :
: : 디스어셈블리 해보면 알 수 있을꺼라고 하는데 안타깝게도 제가 어셈블리를 모르는 터라 도움을 구하고자 합니다.
: :
: : 우선 코드를 올리도록 하겠습니다.
: :
: : 소스는 테스트를 위해 작성한 것이며 원래는 TOne는 SingleTon을 상속받아 생성한 클래스입니다.
: :
: : class TOne
: : {
: : public:
: : TOne() { m_nIndex = 0; }
: : virtual ~TOne() {}
: :
: : int GetIndex() { return m_nIndex; }
: :
: : protected:
: : int m_nIndex;
: :
: : };
: :
: : class TTwo : public TOne
: : {
: : public:
: : TTwo() {}
: : virtual ~TTwo() {}
: :
: : int GetNextIndex() { return ++m_nIndex; }
: :
: : };
: :
: : TOne *pOne = new TOne();
: : TTwo *pTwo = ( TTwo* ) pOne;
: : delete pOne;
: : pOne = NULL;
: : pTwo->GetNextIndex();
: :
: : 위와같이 두 클래스가 존재하며 1은 2를 상속받았습니다.
: :
: : 모두 인라인 처리하였으나 위에 달리 적기 번거롭기 때문입니다. 인라인처리를 하지 않아도 결과는 같습니다.
: :
: : 1을 생성하여 2에 캐스팅하여 포인터를 넘겼고 또 1를 소거하여 NULL까지 넣었습니다.
: :
: : 제 머리에서는 당연히 pTwo의 GetnextIndex() 호출은 당연히 메모리 엑세스 바이얼레이션이라 생각하는데
: :
: : 그렇지 않습니다.
: :
: : 테스트한 버전은 빌더 5, 6 두개와 Visual C++ 2003, 6.0 총 4개 버전입니다.
: :
: : 모두 정상적으로 아주 정상적으로 동작되고 있습니다.
: :
: : 어찌 이런 결과가 나타나며 코드의 안정성과 캐스팅에 대한 견해등 관련된 이야기를 듣고싶습니다.
: :
: : 아주 작은 부분까지도 아시는부분이 있다면 적어주시면 좋겠습니다.
: :
: :
: : 감사합니다.
|