【发布时间】:2024-05-01 18:50:01
【问题描述】:
我正在为我的编程课制作一个模拟飞碟射击的游戏。
主要的Game 类包含std::vector<Bullet> bullets,其中Bullet 是我的类。它仅包含具体类型的成员,并覆盖基类Drawable 来绘制和更新自身。它没有重新定义任何运算符。在每一帧,bullets 都会循环播放,每个子弹都会更新和绘制。
当用户按下一个键时,我将Bullet 添加到bullets,如下所示:
在游戏中::handleInput:
if (ui.isSpaceBar())
{
Bullet newBullet = rifle.fire();
addBullet(newBullet);
}
rifle.fire 像这样返回Bullet:
Bullet Rifle :: fire()
{
... calculation of position and velocity...
return Bullet(...position and velocity values...);
}
而addBullet 看起来像这样:
void addBullet(const Bullet & newBullet)
{
bool assigned = false;
for (int i = 0; i < bullets.size(); i++)
{
// If the i'th bullet is off-screen or hit something ...
if (bullets[i].isDead())
{
// ... then overwrite it with the new bullet,
// instead of using push_back, to avoid constantly
// increasing the size of the vector
bullets[i] = newBullet;
assigned = true;
break;
}
}
if (!assigned)
bullets.push_back(newBullet);
}
我的问题是关于bullets[i] = newBullet; 这一行。在使用索引器覆盖向量中的值之前,我是否需要 delete 任何东西?如果我理解正确,使用值而不是指针(Bullet 代替 Bullet *,return Bullet(...) 代替 return new Bullet(...))意味着我不必调用 delete,Bullet 实例是当它们超出范围时自动销毁,这将是当向量超出范围时。那正确吗?如果是这样,是否使用向量的索引器运算符delete 旧值(在这种情况下为“死”项目符号)?如果没有,我错过了什么?我应该使用指针而不是值吗?
【问题讨论】:
-
不,你不需要调用delete。事实上,这样做可能会使您的程序崩溃。您不能删除未明确新建的内容。如果向量的所有元素都是同一类型,则不需要使用指针。
标签: c++ pointers memory-management vector