2011-02-16 26 views
3

我正在嘗試創建一個簡單的遊戲,但我無法找到某個內存泄漏。該程序每隔一秒左右,似乎使用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`參數作爲指針?順便說一句,選擇代碼並按下`CTRL + K`來格式化代碼。 – Naveen 2011-02-16 11:08:39

+0

Just FUI - 縮進整個代碼塊,不要使用`(反向)符號,選擇代碼塊並按下代碼編輯器上方的代碼鍵:) – gnud 2011-02-16 11:11:06

回答

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); 
      } 
     } 
     } 
    } 
    } 

或者使用它後刪除Position對象! 請注意,動態分配非常緩慢。

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; 
      } 
     } 
     } 
    } 
    } 
3

新位置()需要相應的刪除。

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

而不是

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

爲什麼不嘗試:

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

正如其他人指出的那樣,您不應該動態分配Position。

更地道的解決辦法:刪除「新」 ...

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'簽名。