|
일단 되는거긴 한데 되면 안되는게 맞죠 -.-;
int a[1];
printf("%d", a[2]); 와 비슷한 코드랄까...
엑세스 바이올레이션이 발생하는 경우는
TOne *p = new TOne;
p = p+1;
delete p; // 할당되지 않은 영역을 제거하려고 하거나
TOne *p = (TOne *)0x12345678;
p->m_nIndex = 2; // '완전' 말도 안되는 주소를 읽거나 쓰려고 하는 경우
아래와 같은 코드는 '다른 프로세스'가 할당한 메모리 영역을 침범 하는것이 아니기 때문에
OS에서 엑세스 바이올레이션으로 취급하지 않는것으로 알고 있습니다 ~_~
조금 다른 측면으로 보면 class의 주소값은 뭐가 되도 왠만하면 돌아가기 때문에..
(할당 된 영역이든 아니든) 아래와 같은 코드가 가능하죵..
struct data
{
int a, b, c;
};
class handler
{
private:
int a, b, c;
public:
char * GetABC()
{
static char buf[32];
swprintf(buf, "%d %d %d", a, b, c);
return buf;
}
};
----사용코드----
struct data d = { 1, 2, 3 };
handler *h = (handler *)&d;
Caption = h->GetABC();
수야!╋ 님이 쓰신 글 :
: 수야!╋랍니다.
:
: 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개 버전입니다.
:
: 모두 정상적으로 아주 정상적으로 동작되고 있습니다.
:
: 어찌 이런 결과가 나타나며 코드의 안정성과 캐스팅에 대한 견해등 관련된 이야기를 듣고싶습니다.
:
: 아주 작은 부분까지도 아시는부분이 있다면 적어주시면 좋겠습니다.
:
:
: 감사합니다.
|