矢量如何自我清理?(还是他们?)

How do vectors clean up after themselves? (Or do they?)

本文关键字:他们 自我 何自我      更新时间:2023-10-16

我正在为我的编程类制作一个模拟双向飞碟射击的游戏。主Game类包含std::vector<Bullet> bullets,其中Bullet是我的类。它只包含具体类型的成员,并重写基Drawable类以绘制和更新自身。它不重新定义任何运算符。在每一帧中,bullets循环通过,并且更新和绘制每个项目符号。

当用户按下一个键时,我会向bullets添加一个Bullet,如下所示:

在游戏中::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是否是旧值(在这种情况下是"死"项目符号)?如果没有,我缺少什么?我应该使用指针而不是值吗?

当使用具体对象(例如Bullet)而不是指向对象的指针时,不需要使用delete。

因此CCD_ 21复制了CCD_ 22。它将bullets[i]的旧值分配给myBullet的新值。当向量超出范围时,它将调用其每个元素的析构函数,析构函数将清除该元素所占用的任何内存。

为了在技术上正确,上面的语句使用赋值运算符(operator=)进行复制。这将执行清理旧bullet并将新bullet's成员变量复制到旧bullet's成员变量所需的任何操作。

CCD_ 29类似。只是它将myBullet添加到向量的末尾。这意味着,如果向量的大小是9,那么现在它将是10。

从技术上讲,push_back使用复制构造函数而不是赋值运算符来构造新对象(我认为),因为不存在现有的旧bullet对象。

底线是,给定一个正确实现的具体类(无论其内部有多复杂),您可以在std::vector中使用它们的实例,而不必担心进行任何内存清理。