|
코드 가드를 이용했더니 다음과 같은 에러를 뱉어냅니다...
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 TEScnro::ShowMsg(AnsiString msg)
{
return "객체생성없이 왜 도냐?";
}
============================================================================
DScnro.cpp에서
EScnro->ShowMsg("");
이렇게 사용하고 있습니다..근데 이 코드가 왜 수행이 되는거죠???
만약 일반 c처럼 생각해서 객체 없이 함수만 호출한다고 한다면...
TEScnro *EScnro; ==> TEScnro EScnro; 이렇게 포인터 없이 사용해야하는거 아닌가요??(struct 사용할때처럼...)
그리고 EScnro->ShowMessage(msg); 이렇게 사용하는게 아니라
EScnro.ShowMessage(msg);로 사용하는거 아닌가요??
위와 같이 코딩하면 왜 수행이 되는지 알려주시면 감사하겠습니다...
또한 메모리 누수 현상과도 관계가 있는지요??
조그만 도움이라도 부탁합니다...ㅜㅜ
|