我需要创建一个类的多个实例,我觉得它可以根据需要执行。我已经读过一个向量只存储一个不是我想要的副本,因为我需要能够在类中访问和计算。我已经尝试过存储指针,但它也没有用完。
Tower.cpp
vector<Projectile*> projectiles;
void Tower::fire(Minion& m)
{
projectiles.push_back(&Projectile(&m, x, 2, y));
}
void Tower::update(Level& level)
{
for (int i = 0; i < projectiles.size(); i++)
{
projectiles.at(i)->update();
}
}
Projectile.cpp
Minion* m;
void Projectile::update()
{
float angle = atan((m->getX() - x) / (m->getY() - z));
x += speed * sin(angle);
z += speed * cos(angle);
}
答案 0 :(得分:3)
让人惊讶;圣洁 dangling pointers ,蝙蝠侠!
projectiles.push_back(&Projectile(&m, x, 2, y));
您似乎试图存储指针,不仅是局部变量,还有临时对象!不确定那些指针在该行完成执行后所指的是什么。
我没有看到你在任何地方存储引用(这很好)。
你基本上必须在这里使用动态分配,这样你就可以自己管理这些对象的生命周期,不过我建议使用智能指针类型,这样你就不必再使用 < / em>很多责任†:
vector<unique_ptr<Projectile>> projectiles;
// ...
projectiles.emplace_back(new Projectile(&m, x, 2, y));
请确保您知道m
的有效期。一般来说,我建议您仔细查看所有对象并弄清楚:
在你开始向所有事情投掷指针之前。 :)
†特别是,不需要delete
。
答案 1 :(得分:2)
你不能这样做:
projectiles.push_back(&Projectile(&m, x, 2, y));
你实际在做的是创建一个类型为Projectile的变量,将其地址传递给vector对象,然后Projectile
实例被销毁,因为它超出了范围。一旦Projectile
实例超出范围,指针将指向任何内容。
我怀疑你要做的是:
projectiles.push_back(new Projectile(&m, x, 2, y));
请记住,当你完成它们时,销毁这些Projectile
对象仍然是你的责任。
例如,以下内容会导致内存泄漏:
projectiles.push_back(new Projectile(&m, x, 2, y));
projectiles.erase(0); // <-- Projectile object still exists, you've only deleted the pointer!!!
这会解决它:
projectiles.push_back(new Projectile(&m, x, 2, y));
// ... later ...
delete projectiles.at(0);
projectiles.erase(0);
当然,执行此操作的理想方法是使用智能指针(如unique_ptr
或shared_ptr
)来管理对象的删除。
如果您坚持使用原始指针但使用Boost,您也可以使用ptr_vector
类来处理删除。
答案 2 :(得分:1)
您正在将LOCAL VARIABLES的指针存储到全局std::vector
中!太糟糕了!
相反,我建议使用std::shared_ptr
的容器。例如:
std::vector<std::shared_ptr<ProjectFile> > projectfiles;
void Tower::fire(Minion &m)
{
projectfiles.push_back(std::make_shared<ProjectFile>(&m, x, 2, y));
}
如果ProjectFile的构造函数不公开,请使用std::shared_ptr
的构造函数而不是std::make_shared
projectfiles.push_back(std::shared_ptr<ProjectFile>(new ProjectFile(&m, x, 2, y)));