我正在尝试创建一个简单的游戏,但我找不到某个内存泄漏。每隔一秒左右,程序似乎就会增加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);
}
知道造成内存泄漏的原因在哪里?我认为它与此部分有关,但如果需要,我可以发布代码的其他部分。
由于
答案 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);