|
C++빌더 컴파일러는 매우 충실하고 완성도가 높습니다.
컴파일러 문제라는 생각은 애초에 안하고 다른 원인을 생각하는 것이 좋습니다.
물론 빌더만의 특성을 타는 것은 따로 생각을 해야겠지요.
우선 님의 코드를 보면 에러없이 잘 컴파일 될게 당연합니다.
: TEScnro *EScnro; ==> TEScnro EScnro; 이렇게 포인터 없이 사용해야하는거 아닌가요??(struct 사용할때처럼...)
: 그리고 EScnro->ShowMessage(msg); 이렇게 사용하는게 아니라
: EScnro.ShowMessage(msg);로 사용하는거 아닌가요??
맞습니다. 그렇게 쓰시면 됩니다. 그러나 객체는 가급적 포인트를 이용하게 정석이고요,
VCL 클래스에서 상속받은 경우는 반드시 포인트로 선언해서 써야 합니다.
그러나 문제는 아래 같으네요.
: AnsiString __fastcall ShowMessage(AnsiString msg)
: {
: return "객체생성없이 왜 도냐?";
: }
이건 클래스 멤버함수가 아닙니다.
그냥 C++ 함수일 뿐이죠.
절대 객체가 생성되지 않았는데 되는 법은 C++ 나라에는 존재하지 않는 법입니다.
아직 빌더에 익숙하지 않으셔서 그런것 같은데, 조금 쓰시다보면 감을 잡으실 것 같네요.
참고로 AnsiString 타이핑하기 길죠..그냥 String 하시면 똑 같습니다.
그럼..
친구들 님이 쓰신 글 :
: 코드 가드를 이용했더니 다음과 같은 에러를 뱉어냅니다...
:
: Error 00164. 0x100C00 (Thread 0x0CA0):
: Method called on invalid object: Attempt to access 4 byte(s) at 0x00000000.
: Call Tree:
: 0x00414B8A(=AAAA.exe:0x01:013B8A) C:\test\EScnro.cpp#77
: ===> 에러가 EScnro에서 발생해서 AScnro까지 던져주고 있습니다...
: 0x0043E67D(=AAAA.exe:0x01:03D67D) C:\test\DScnro.cpp#289
: 0x004497E0(=AAAA.exe:0x01:0487E0) C:\test\CScnro.cpp#132
: 0x0044A9E7(=AAAA.exe:0x01:0499E7) C:\test\BScnro.cpp#293
: 0x0044A30E(=AAAA.exe:0x01:04930E) C:\test\AScnro.cpp#229
: 0x400EE4E7(=vcl60.bpl:0x01:03D4E7)
: ------------------------------------------
: 위와 같은 에러를 수백개 뱉어내네요....메모리도 콸콸 세고.......-_-;;
: 문제는 invalid object라는 에러인데.... EScnro.cpp는 객체를 생성을 하지않고 쓰고 있습니다
: 여기서 제가 의문이 드는것은 객체 생성을 하지 않고 다음과 같이 사용했을때
: 런타임시에 객체가 없다고 에러를 뱉어야 하는데 어떻게 빌더가 에러없이 도는지 이해가 가지 않습니다...
:
: ============header 파일====================
:
: #ifndef EScnroH
: #define EScnroH
:
: //---------------------------------------------------------------------------
: class TEScnro
: {
: private: // User declarations
: public: // User declarations
: __fastcall TEScnro();
: AnsiString __fastcall ShowMessage(AnsiString msg);
: };
: //---------------------------------------------------------------------------
: extern PACKAGE TEScnro *EScnro;
: //---------------------------------------------------------------------------
:
: #endif
:
:
: ============cpp 파일====================
: #include "EScnro.h"
:
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
:
: TEScnro *EScnro;
:
: __fastcall TEScnro::TEScnro()
: {
: }
:
: AnsiString __fastcall ShowMessage(AnsiString msg)
: {
: return "객체생성없이 왜 도냐?";
: }
:
: ============================================================================
:
: 만약 일반 c처럼 생각해서 객체 없이 함수만 호출한다고 한다면...
:
: TEScnro *EScnro; ==> TEScnro EScnro; 이렇게 포인터 없이 사용해야하는거 아닌가요??(struct 사용할때처럼...)
: 그리고 EScnro->ShowMessage(msg); 이렇게 사용하는게 아니라
: EScnro.ShowMessage(msg);로 사용하는거 아닌가요??
:
: 위와 같이 코딩하면 왜 수행이 되는지 알려주시면 감사하겠습니다...
: 또한 메모리 누수 현상과도 관계가 있는지요??
:
: 아시는분 제발 가르쳐 주세요...급해요..ㅜ.ㅜ
|