gpt4 book ai didi

c++ - 绘画时内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 19:47:00 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的游戏,但找不到特定的内存泄漏。每隔一秒左右,程序似乎多使用 3mb 的内存。

问题出在这个绘制方法上。如果我不调用此方法,一切正常。我正在尝试在屏幕的多个部分绘制一个 Sprite :

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

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

谢谢

最佳答案

您是否使用托管 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;
}
}
}
}
}

关于c++ - 绘画时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5015615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com