绘画上的内存泄漏

时间:2011-02-16 11:04:20

标签: c++ winapi

我正在尝试创建一个简单的游戏,但我找不到某个内存泄漏。每隔一秒左右,程序似乎就会增加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));  
            }  
        }
    }
} 

如果我删除了draw的方法调用,则没有问题,所以问题在于该方法:

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

知道造成内存泄漏的原因在哪里?我认为它与此部分有关,但如果需要,我可以发布代码的其他部分。

由于

5 个答案:

答案 0 :(得分: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;
           }
         }
       }
    }
    }

答案 1 :(得分:3)

new Position()需要相应的删除。

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

答案 2 :(得分: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;
    ...

答案 3 :(得分: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);  
            }  
        }
    }
} 

此解决方案不要求您更改方法的签名。

答案 4 :(得分:1)

而不是

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

为什么不尝试:

Position pos(j,i);
blueWall->draw(hBackBufferDC, &pos);
相关问题