加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 绘画时内存泄漏

发布时间:2020-12-16 10:18:20 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个简单的游戏,但我找不到某个内存泄漏.每隔一秒左右,该程序似乎使用3mb以上的内存. 问题在于这种绘制方法.如果我不称这种方法,一切正常.我正在尝试在屏幕的几个部分上绘制一个精灵: void Map::draw(HDC hBackBufferDC) { for(int i = 0; i
我正在尝试创建一个简单的游戏,但我找不到某个内存泄漏.每隔一秒左右,该程序似乎使用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,this->hSpriteDC,SRCAND);

    SelectObject(this->hSpriteDC,this->hImage);
    BitBlt(hBackBufferDC,SRCPAINT);

    SelectObject(this->hSpriteDC,oldObj);
}

知道是什么导致内存泄漏吗?我认为这与此部分有关,但如果需要,我可以发布代码的其他部分.

谢谢

解决方法

你是否使用托管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,tmp);
              delete tmp;
           }
         }
       }
    }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读