|
좀 종교적인 글일수도 있는데..
C(C++)언어가 지향하는것중에 하나가
"C언어는 프로그래머를 신뢰하고, 시키는대로만 한다" 라는 부분인데요..
OS나 컴파일러가 저런 체크하는 코드까지 자동으로 넣어주면 퍼포먼스가 떨어지는건 당연한거구요
그래서 에러디텍션(바운드체커)이나 코드가드 같은 툴이 따로 있는거고, 성능때문에 런타임에는 사용하지 않죠..
다만 어플리케이션 내부의 침범이라도 사이드 이펙트에 의해서 OS가 죽으면 안되니까
그런 부분에 대해서 보호장치가 있는 것 같네요
만해님 컴퓨터 메모리 상태가 익셉션이 걸리기에 딱 좋은 상황이었다든지 그랬을수 있죠 ~_~
어쨌든 저런 사소한 부분까지 언어 차원에서 잡아주길 원한다면 ADA같은걸 사용하시면 [...]
수야!╋ 님이 쓰신 글 :
: ㅡㅡ;;
:
: 만해아주씨는 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개 버전입니다.
: : :
: : : 모두 정상적으로 아주 정상적으로 동작되고 있습니다.
: : :
: : : 어찌 이런 결과가 나타나며 코드의 안정성과 캐스팅에 대한 견해등 관련된 이야기를 듣고싶습니다.
: : :
: : : 아주 작은 부분까지도 아시는부분이 있다면 적어주시면 좋겠습니다.
: : :
: : :
: : : 감사합니다.
|