2008-09-13 10 views
-3

나는 곧 my blog에 글을 게시 할 예정이지만, 나는 무엇이라도 놓치지 않았다는 것을 확인하고 싶다.C++ 퀴즈 - 싱글 톤

내가 놓친 예를 찾아 내 게시물에 나를 적어 두겠습니다.

주제가 실패 함 싱글 톤 구현 : 어떤 경우에 우연히 싱글 톤 인스턴스가 여러 개있을 수 있습니까? 실제로 별도의 클래스 - 여러 DLL을 또는 DLL과 싱글의 실행

  • 템플릿 정의에 instance()
  • 설립에 첫 번째 호출에

    • 경쟁 조건 :

      지금까지 내가 함께 왔어요

    내가 상실한 다른 방법은 무엇입니까?

  • +0

    내 게시물에서이 게시물의 정보를 사용하고자하므로 전체 공개라고 느꼈습니다. 죄송합니다. 재밌는 일을 느꼈지만 흥미로운 질문이 남아 있습니다. 그렇지 않습니까? – theschmitzer

    +0

    게시물이 올라와 있습니다. 감사. – theschmitzer

    답변

    3

    cpp 파일에서 초기화하는 정적 인스턴스 필드를 사용하는 경우 일부 정적/전역 초기화가 사용자의 단일 인스턴스를 가져 오려고 시도하면 여러 인스턴스 (더 나쁜 동작)를 얻을 수 있습니다. 이는 컴파일 단위에서의 정적 초기화 순서가 정의되지 않았기 때문입니다.

    +0

    그래서 _instance에서 사용하는 전역 메모리가 NULL로 초기화되고, 다른 하나의 전역 변수는 인스턴스 # 1을 할당 한 다음 명시적인 _instance 초기화 프로그램을 실행하고이를 NULL로 다시 설정하고 인스턴스에 대한 다음 호출을 호출합니다.()가 두 번째 시간을 할당합니까? – theschmitzer

    +0

    그렇다면 전역 데이터 멤버가 초기화되기 전에 전역 메모리가 어떻게 보이는지 ... – theschmitzer

    +0

    중요한 점은 전역 메모리가 main보다 먼저 NULL로 초기화된다는 것입니다. 단점은 싱글 톤 인스턴스를 요청하기 전에 반드시 필요한 것은 아닙니다. –

    1

    ctor가 개인용이면 상속은 문제가되지 않습니다.

    그러나 복사 생성자를 허용하지 않으면 사용자가 의도적으로 단독 인스턴스를 복사 할 수 있습니다. boost::noncopyable으로부터 개인적으로 상속하는 것이 이것을 방지하는 가장 쉬운 방법입니다.

    +0

    상속을 사용하는 대신 두 가지 방법을 비공개로 선언하는 것이 훨씬 좋습니다. 가져 오기를 원하지 않는다면 부스트를 포함하고 상속을 사용합니다 (두 가지 사소한 비용 모두 알고 있지만 알아두면 좋습니다). – hazzen

    +0

    그건 올바른 옵션이고 이전에했던 것입니다. 대체 답변으로 게시하지 않는 이유는 무엇입니까? BTW, 더 주관 ... boost :: noncopyable 메서드는 특정 줄 번호가있는 컴파일러 오류를 생성합니다. 귀하의 방법은 초보자가 추적하기가 어려울 수있는 링크 시간 오류를 발생시킵니다. –