2011-02-16 4 views
3

간단한 게임을 만들려고하지만 특정 메모리 누수를 찾을 수 없습니다. 1 초마다, 프로그램은 3MB 이상의 메모리를 사용하는 것으로 보입니다.그림의 메모리 누출이

문제는이 그리기 방법 때문입니다. 이 메서드를 호출하지 않으면 모든 것이 올바르게 작동합니다. 나는 화면의 여러 부분에 스프라이트를 칠하려고 해요 : 나는 무승부의 메소드 호출을 제거하면

void Map::draw(HDC hBackBufferDC) 
{ 
    for(int i = 0; i < 24; i++) 
    { 
     for(int j = 0; j < 27; j++) 
     { 
      if(mapState[i][j] == 'm') 
      { 
       blueWall->draw(hBackBufferDC, new Position(j, i)); 
      } 
     } 
    } 
} 

이, 아무런 문제가없는, 그래서 문제는 방법이다 :

void StaticSprite::draw(HDC hBackBufferDC, Position* pos) 
{ 
    int x = (int)pos->x * 22; 
    int y = (int)pos->y * 22; 

    HGDIOBJ oldObj = SelectObject(this->hSpriteDC, this->hMask); 

    BitBlt(hBackBufferDC, x, y, 22, 22, this->hSpriteDC, 0, 0, SRCAND); 

    SelectObject(this->hSpriteDC, this->hImage); 
    BitBlt(hBackBufferDC, x, y, 22, 22, this->hSpriteDC, 0, 0, SRCPAINT); 

    SelectObject(this->hSpriteDC, oldObj); 
} 

메모리 누수의 원인은 무엇입니까? 나는이 부분과 관련이 있다고 생각하지만 필요한 경우 코드의 다른 부분을 게시 할 수 있습니다.

감사합니다.

+0

'StaticSprite :: draw'가'Position' 매개 변수를 포인터로 사용하는 이유는 무엇입니까? BTW, 코드를 선택하고 CTRL + K를 눌러 코드를 포맷하십시오. – Naveen

+0

그냥 FUI - 전체 코드 블록을 들여 쓰려면'(역 따옴표) 기호를 사용하지 말고 코드 블록을 선택하고 편집기 위의 코드 키를 누르십시오 :) – gnud

+0

그래, 고쳐 주셔서 고맙습니다. 나는 다음 번에 그것을 시도 할 것이다 :) – Bv202

답변

4

당신은 C를 관리 ++ 여부를 사용하고 있습니까? 새 위치 (24 * 27) 번 할당하고 있습니다. Map :: draw를 호출 할 때마다 648 개의 누수가 발생합니다.

자동 개체를 사용하십시오.

void Map::draw(HDC hBackBufferDC) 
    { 
    for(int i = 0; i < 24; i++) 
     { 
     for(int j = 0; j < 27; j++) 
     { 
      if(mapState[i][j] == 'm') { 
       Position tmp(j,i); 
       blueWall->draw(hBackBufferDC, &tmp); 
      } 
     } 
     } 
    } 
    } 

사용 후 위치 개체를 삭제하십시오! 동적 할당이 매우 느립니다.

void Map::draw(HDC hBackBufferDC) 
    { 
    for(int i = 0; i < 24; i++) 
     { 
     for(int j = 0; j < 27; j++) 
     { 
      if(mapState[i][j] == 'm') { 
       Position *tmp = new Position(j,i); 
       blueWall->draw(hBackBufferDC, tmp); 
       delete tmp; 
      } 
     } 
     } 
    } 
    } 
+0

오 잘, 나의 매우 어리석은 실수. 고마워요 :) – Bv202

3

새로운 Position()에는 해당 삭제가 필요합니다. 대신

blueWall->draw(hBackBufferDC, new Position(j, i)); 

if(mapState[i][j] == 'm') { 
    Position P(j, i); 
    blueWall->draw(hBackBufferDC, &P); 
} 
1

왜 시도하지 :

Position pos(j,i); 
blueWall->draw(hBackBufferDC, &pos); 
2

다른 사람들도 지적했듯이 동적으로 위치를 할당해서는 안됩니다.

더 관용적 솔루션 : ...

blueWall->draw(hBackBufferDC, Position(j, i)); 

과 const를 참조로 전달할 제거 ... "새로운"

void StaticSprite::draw(HDC hBackBufferDC, const Position& pos) 
{ 
    int x = (int)pos.x * 22; 
    int y = (int)pos.y * 22; 
    ... 
2

당신이 반복하기 전에 자동 변수를 선언해야 더 효율적으로

void Map::draw(HDC hBackBufferDC) 
{ 
    Position pos; 
    for(int i = 0; i < 24; i++) 
    { 
     for(int j = 0; j < 27; j++) 
     { 
      if(mapState[i][j] == 'm') 
      { 
       pos.x = j; 
       pos.y = i; 
       blueWall->draw(hBackBufferDC, &pos); 
      } 
     } 
    } 
} 

이 솔루션을 사용하면 모임을 변경할 필요가 없습니다. hod '서명.

관련 문제