c++에서 클래스 전체가 static으로 선언되어 있을 때 질문입니다.

island78의 이미지

#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 = NULL;

class에 대한 instance를 생성 한 것이 아닌
class에 대한 pointer 타입 변수를 생성 한 것입니다.
pointer type의 변수가 static으로 선언 된 것이기에
실제 instance는 생성되지 않았고
segment fault를 맞는거는 당연해 보입니다

island78의 이미지

상용 소스가 저렇게 되어 있어 당황스러워서..

역시 잘못된 용법이 맞네요..

익명 사용자의 이미지


문제는 위에 익명님이 말씀해주셨구요.

static MUser* pMaster = NULL;

static MUser* pMaster = new MUser;
하시면 됩니다.

물론 pMaster는 static_call 함수 내에서만 유효합니다.
static 이기 때문에 인스턴스는 한개만 생성됩니다.
단, static_call을 부를 때만 동일한 pMaster를 사용합니다.

다른 함수에서도 pMaster를 사용하시고 싶으시면, MUser struct 내에 static으로 자신을 가지면 됩니다.(싱글톤)

island78의 이미지

아 NULL이 아니라 아예 포인터에 해당하는 메모리 공간을 생성해야 하는군요...

감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.