[Design Pattern] 싱글톤 패턴 더 알아보기 - 3

phoenix singleton

피닉스 싱글턴은 파괴된 메모리가 다시 생성되는 싱글턴을 뜻한다. 싱글톤 참조시 해당 객체의 소멸 여부를 파악하고 소멸되었다면 이를 되살리는 방식으로 동작하는 싱글톤이다. 이 동작 기반의 근거는 static으로 잡힌 부분의 메모리는 해제가 되어도 컴파일러가 초기화 하지 않기 때문에 해당 메모리를 재 사용해서 객체의 생성자만 다시 호출해서 사용하는 방식이다. atexit() 함수에 killPhoneix()를 등록해 프로그램 종료시에 소멸자를 호출한다.

근데.. 솔직히 방식도 이해했고 죽이고 살리는것도 이해했고.. 테스트도 했고 하는데 이걸 어디다 쓰는지 모르겠다.. static 메모리에 잡아두는건 컴파일 타임에 크기가 결정되는데 컴파일 타임에 크기가 결정되는 메모리의 데이터를 죽이고 다시 살린다고..? 잘 이해가 가질 않는다. 혹은 이미 종료된 프로그램을 동일한 위치의 메모리에 띄워서 해당 객체를 재사용하나..? 알고있기론 프로그램이 종료되면 메모리도 같이 정리되는걸로 알고있는데.. 아직 배움이 부족해 활용도를 모르겠지만.. 코드를 공부하면서 많은걸 배울 수 있었다.

다음은 피닉스 싱글톤의 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class PhoenixSingleton
{
private:
static bool bDestroyed;
static PhoenixSingleton* pIns;

PhoenixSingleton()
{
std::cout<<"PhoenixSingleton Constructor"<<std::endl;
};

PhoenixSingleton(const PhoenixSingleton& other);

~PhoenixSingleton()
{
std::cout<<"PhoenixSingleton Destructor"<<std::endl;
bDestroyed = true;
}

static void Create()
{
static PhoenixSingleton ins;
pIns = &ins;
}

static void KillPheonix()
{
pIns->~PhoenixSingleton();
}

public:
static PhoenixSingleton& GetInstance()
{
if (bDestroyed)
{
new(pIns) PhoenixSingleton;
atexit(KillPheonix);
bDestroyed = false;
}
else if (pIns == NULL)
{
Create();
}

return *pIns;
}
};

bool PhoenixSingleton::bDestroyed = false;
PhoenixSingleton* PhoenixSingleton::pIns = NULL;
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/13/Design%20Pattern/IntermediateSingleton3/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.