c++에서 클래스 전체가 static으로 선언되어 있을 때 질문입니다.
#define MUTYPE_NONE 0x00
#define MUTYPE_MASTER 0x08
struct MUser
{
MUser() { Reset(); }
~MUser() { }
void Reset()
{
m_uType = MUTYPE_NONE;
};
int m_uType;
};
int main(int argc, char *argv[])
{
static_call ( );
}
int static_call ( )
{
static MUser* pMaster = NULL;
//Segmentation fault
if ( !( (pMaster2->m_uType) & MUTYPE_MASTER) )
{
cout << "In static_call" << endl;
}
}
대충 위와 같은 형태의 클래스가 있습니다. 그런데 외부 함수에서(정확하게는 class의 멤버함수 내부지만 생략했습니다.) static으로 class 포인터를 NULL로 초기화 하여 선언했습니다.
이런 경우 내부 값은 어떻게 되나요? 이 때도 pMaster의 안에 있는 값은 초기화 상태인가요?
그리고 pMaster아래의 멤버 변수에 접근하려고 했더니 모두 Segmentation fault가 떨어지더군요.. 심지어 static이 아닌 class 포인터 함수를 만들고 거기다 카피해서 쓸려고 했는데도 Segmentation fault가 떨어졌습니다.
main에서 pMaster에 직접 접근하여 내부 값을 수정하는 것은 안되지만 static_call함수 내부에서도 static으로 선언된 클래스의 멤버 변수에는 접근할 수 없는 것인지요? 아니면 별개의 형식으로 접근해야 하는지요? (pMaster2->MUser::m_uType형태로 해봤는데 안되더군요..)
이리저리 하는데도 이해가 안가서..(현재 소스는 해당 로직을 타지 않기 때문에 Segmentation fault가 안떨어지는 것으로 추측하고 있습니다.) 만약 해당 소스가 잘못된 소스면 수정해야 하는데 제가 C++ 경험이 거의 없어서 질문 드립니다.
static MUser* pMaster =
static MUser* pMaster = NULL;
class에 대한 instance를 생성 한 것이 아닌
class에 대한 pointer 타입 변수를 생성 한 것입니다.
pointer type의 변수가 static으로 선언 된 것이기에
실제 instance는 생성되지 않았고
segment fault를 맞는거는 당연해 보입니다
상용 소스가 저렇게 되어 있어 당황스러워서.. 역시
상용 소스가 저렇게 되어 있어 당황스러워서..
역시 잘못된 용법이 맞네요..
문제는 위에 익명님이 말씀해주셨구요. static
문제는 위에 익명님이 말씀해주셨구요.
static MUser* pMaster = NULL;
를
static MUser* pMaster = new MUser;
하시면 됩니다.
물론 pMaster는 static_call 함수 내에서만 유효합니다.
static 이기 때문에 인스턴스는 한개만 생성됩니다.
단, static_call을 부를 때만 동일한 pMaster를 사용합니다.
다른 함수에서도 pMaster를 사용하시고 싶으시면, MUser struct 내에 static으로 자신을 가지면 됩니다.(싱글톤)
아 NULL이 아니라 아예 포인터에 해당하는 메모리
아 NULL이 아니라 아예 포인터에 해당하는 메모리 공간을 생성해야 하는군요...
감사드립니다.
댓글 달기