싱글턴을 이용한 메인함수의 메모리 버퍼 정리

|

싱클턴 클래스를 하나 만들어서

메모리 버퍼를 가져와 관리 하도록 하겠다.

ST.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include "header.h"
 
class ST{
private:
    ST(){}
public:
    static *ST instance;
    static *ST Call()
    {
        if( instance != NULL ) instance = new ST;
        return instance;
    }
 
    void CreateBuffer( HWND hWnd );
    HBITMAP CreateBitmap( int Index );
    void DeleteMemory();
};
cs

헤더 파일을 새로 하나 만들어준다.

함수 이름 

설명 

 void CreateBuffer( HWND hWnd );

 메모리 버퍼들을 만들어주는 함수.

 HBITMAP CreateBitmap( int Index );

 비트맵을 불러오는 함수.

 void DeleteMemory();

 생성된 메모리를 지워주는 함수.

 

초기화

 

 

메인cpp에 WM_CREATE에 있는 메모리 생성 부분을 ST클래스의 CreateBuffer함수로 가져온다.

 

DoubleBuffer.cpp

 

ST.h

버퍼들을 ST클래스의 CreateBuffer로 옮겨 줍시다.

 

DoubleBuffer.cpp

 

 ST.h

 

          불러온 비트맵을 반환 해줍니다.

 

LoadBitmap의 첫 번째 인자로 윈도우 핸들이 필요하므로 멤버 변수로 m_hInstance를 만들어 줍니다.

 

       m_hInstance의 초기화는 CreateBuffer 그러니까, 메모리가 만들어 질때 해주면 됩니다.

만들어진 핸들은 로드 비트맵 함수의 첫 번째 인자에 넣어 주도록 합시다.

 

메인 함수로 돌아와

필요 없어진 LoadBitmap을 지워주도록 합시다.

 

ST에 있는 버퍼 만드는 함수를 불러와 주시고

마찬가지로 비트맵을 불러오는 함수를 불러줍시다.

그리고 이제 g_hBackBuffer와 g_hMemDC는 필요 없으므로

Init에서 지워줍시다.

Object,

Object_BackGround,

Object_Hero

에 함수의 매개변수로 있는 g_hBackBuffer와 g_hMemDC를 다 지워주도록 합시다.

Object에는 g_hBackBuffer와 g_hMemDC의 맴버 변수도 필요 없어졌으므로 지워줍시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
case WM_CREATE:
    {
        ST::Call()->CreateBuffer(hWnd);
        g_hBGA = ST::Call()->CreateBitmap(IDB_BITMAP1);
        g_hHero = ST::Call()->CreateBitmap(IDB_BITMAP2);
 
        g_CBGA = new BackGround;
        g_CBGA->Init( g_hBGA );
 
        g_CHero = new Hero;
        g_CHero->Init( g_hHero );
        break;
    }
cs


아직도 길기 때문에 조금더 줄여 주도록 하겠습니다.



 

 

이젠 만들어진 메모리를 삭제 합시다.

1
2
3
4
5
6
void ST::DeleteMemory()
{
    DeleteObject(g_hBackBitmap);
    DeleteDC(g_hMemDC);
    DeleteDC(g_hBackBuffer);
}
cs

 

1
2
3
4
5
6
 case WM_DESTROY :
{
    ST::Call()->DeleteMemory();
    PostQuitMessage(0);    
    break;
}
cs

 

 메모리를 저렇게 따로 지우는 이유는 WM_DESTROY()가 호출된다고 해서

프로그램이 바로 종료 되는것이 아니고

while루프를 몇번 더 돌기 때문에 메모리에 쓰레기값이 생깁니다 그렇기 때문에

while이 종료된 후에 지워주는 것이 더 확실하게 지워주는 것임돠

 

결과

 



잘 되네영


'API > 이론' 카테고리의 다른 글

캐릭터 점프  (0) 2016.05.01
메모리 생성을 각 클래스 안으로 넣기.  (0) 2016.04.30
싱글턴 패턴  (0) 2016.04.30
이미지 깜박거림 없앰.  (0) 2016.04.29
캐릭터 뒷배경 검정색 없애기.  (0) 2016.04.29
And