矢量如何自我清理?(还是他们?)
How do vectors clean up after themselves? (Or do they?)
我正在为我的编程类制作一个模拟双向飞碟射击的游戏。主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
中使用它们的实例,而不必担心进行任何内存清理。
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 这个SSDO演示的GLSL版本要求是自我冲突的吗
- 我怎样才能有 2 个程序并让用户选择他们想要使用的程序?
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 我们是否应该转向新的自我分配保护方式?
- 全局静态生存期?他们会让你的程序崩溃吗?
- 如何正确消除继承类型定义的歧义?以及如何简化他们的创作?
- C++:告诉用户输入 A、B 或 C,但如果他们输入不同的字符怎么办?
- 施工中的自我参考
- 如何通过 CMake 使用他们的 SHA256 哈希下载提升?
- 类的私有成员在我的类实例化期间更改,即使他们不应该
- 如何自我检查工作
- EXC_BAD_ACCESS Xcode,来自我的 Objective-C++ 和 swift 桥接标头中的 C++ 包
- 我如何一遍又一遍地向用户提问,直到他们输入正确的值字段?
- 自我分配变量的定义
- 您可以声明会员功能并使他们做不同的事情吗?
- 矢量如何自我清理?(还是他们?)