gpt4 book ai didi

c++ - 使用 marmalade SDK 的内存使用问题

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:47 27 4
gpt4 key购买 nike

我有一个子弹类。我尝试通过以下代码实例化它:

我总是得到一个断言,有一个正在使用的内存..为什么?

在另一个叫做 ship 的类中:

   if (g_Input.isKeyDown(s3eKeySpace))// && Canfire)
{
Bullet *bullet = new Bullet();
bullet->Init(SHIP_BULLET);
bullet->setPosition(Position.x, Position.y - 20);
Bullets->push_back(bullet);
Canfire = false;

}

这被称为导致内存仍在使用的每一帧:

for (list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end();)
{
(*it)->Update(dt);

if ((*it)->IsDestroyed)
{
Canfire = true;
it = Bullets->erase(it);
}
else
{
it++;
Canfire = false;

}

}

Ship 类的析构函数

Ship::~Ship()
{
for (std::list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end(); ++it)
delete *it;
delete Bullets;

}

class Bullet
{
public:
Bullet();
~Bullet();
public:
void Init(BulletTypes bulletType);
void Update(float dt);
void Render();
CIw2DImage* Image; // curr image
}

void Bullet::Init(BulletTypes bulletType)
{
BulletType = bulletType;
if (BulletType == SHIP_BULLET)
{
Image = Iw2DCreateImage("textures/ship_bullet.png");
if (Image == nullptr)
return;

}
}
Bullet::~Bullet()
{
delete Image;
}

最佳答案

执行此代码会导致泄漏:

for (list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end();)
{
(*it)->Update(dt);

if ((*it)->IsDestroyed)
{
Canfire = true;
it = Bullets->erase(it);
}
else
{
it++;
Canfire = false;
}
}

基本上,您从容器中删除了一个动态分配的元素,失去了对它的任何引用,因此您无法再释放它的内存。显然,调用 Ship 析构函数只会释放当前在列表中的元素,不包括在迭代中删除的元素。

我建议将此作为修复:

for (list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end();)
{
(*it)->Update(dt);

if ((*it)->IsDestroyed)
{
Canfire = true;
delete *it; // it now points to invalid address
it = Bullets->erase(it);
}
else
{
it++;
Canfire = false;
}
}

另一种选择是将所有移除的子弹存储在 Ship 类的其他容器中,以防 Bullet 在销毁后可以被引用。这个想法的问题是,你有很多被摧毁的子弹占用内存,并且必须想出一个解决方案,一旦它们真的被证明无用,如何将它们移除。

如果您坚持这样做,使用 std::shared_ptrs 而不是列表中的原始指针可以解决您的问题(稍微降低性能)。

关于c++ - 使用 marmalade SDK 的内存使用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27669253/

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