2014년 4월 7일 월요일

함수 안 static 개체



아직 정확히 이유는 모르지만 함수 안에 static 개체를 만들어 놓으면 메모리 할당이 이상해 지는 경우를 몇 번 봤습니다.

댓글 8개:

  1. 싱글쓰레드에서도 경험하신 건가요? 멀티쓰레드에서는 static 개체의 초기화 여부가 쓰레드세이프하지 않아서 vs에서도 문제가 됩니다.

    답글삭제
    답글
    1. 한번은 확실히 싱글쓰레드였네요.. 근데 생각해보니 모두다 PowerPC에서 일어난 일이에요.. 혹시 gcc의 powerpc 구현이 뭔가 다른건 아닐까 도 생각하게 되네요....

      삭제
  2. 음 저도 멀티 플랫폼엔진 간단한거 만들어 보고 있는중인데요. 각 종 Manager클래스를 Singleton으로 만들어 쓰는데, 말씀하신 방식으로 구현했거든요(effective c++에서 본이후로 완전 간편해 보여서 ㅋㅋ).. 물론 안드로이드 플랫폼은 gcc 컴파일러로 컴파일 되기때문에, 같은 상황인거 같은데 말씀하신 문제가 난적이 없네요ㅎㅎ 하나 다른건 생성자에서 New 하는 코드가 없기는 합니다 ㅎㅎ

    답글삭제
    답글
    1. 아... 그게 effective c++에서 나온 방법이었나요?... 그렇다면 좋은 책이 사람들을 버려놨..(응?) ㅋㅋㅋ

      비디오 올리고 좀더 생각해보니 저런 문제가 있는 플랫폼들이 powerpc cpu를 쓰기도 했어요. 혹시 gcc powerpc쪽에 저런 문제가 있는건 아닌지 또 생각이 들지만.. 제가 테스트하긴 귀찮으니.. 랄라라~

      삭제
  3. 혹시 이 문제가 아닌가 싶네요.
    http://www.parashift.com/c++-faq/static-init-order.html

    답글삭제
    답글
    1. 저건 cpp파일 안에 static 오브젝트가 있는 경우를 이야기하는거 같아요. 저의 경우에는 함수가 처음 호출되는 시점이었으니 main()함수 진입후고.. 그렇다면 .cpp파일 안에 있는 모든 스태틱 개체는 이미 생성이 되었을 때니까 위의 설명이 직접적으론 적용되지 않는게 아닌가? 하는 생각이 듭니다...

      그래도 좀더 생각해봐야죠. 이거랑 비슷한데 조금만 다른 어떤 이유때문이 아닌지...

      삭제
  4. Effective C++(3rd)의 항목 4와 관련이 있지 않을까 조심스럽게 생각해 봅니다.
    static object를 직접 사용하지 말고, static object의 리퍼런스를 반환하는 함수를
    사용하면 static object는 반드시 초기화되므로 이 방법을 사용하라고 되어 있네요.
    요약하면 "비지역 정적 객체"를 "지역 정적 객체"로 변경하기 입니다.
    이 상황과 연관이 있는지 모르겠네요.

    답글삭제
    답글
    1. 음 이번에 저의 경우에는(예전 경우는 기억이 안남 호호) 리퍼런스 반환받아 사용하는건 아니였고 포인터를 반환해서 사용한 경우였거든요..? 이렇게요

      A* GetDefaultA()
      {
      static A a;
      return &a;
      }

      (물론 A안의 생성자에서는 또 다른 생성자를 호출하는 코드가 있습니다.)


      포인터를 반환하는게 effective c++에서 말한 reference를 반환하는 방법과 내부적으론 전혀 차이가 없을거라 생각하는데..... 그럼 이건 아닌건 같다고 생각합니다.

      삭제