存储对指针的引用

Storing references to a pointer

本文关键字:引用 指针 存储      更新时间:2023-10-16

我需要创建一个类的许多实例,我觉得向量可以根据我的需要来创建这些实例。我读到向量只存储一个副本,这不是我想要的,因为我需要能够在类中访问和计算。我试过存储指针,但也不起作用。

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();
}
}

射弹.cpp

Minion* m;
void Projectile::update()
{
float angle = atan((m->getX() - x) / (m->getY() - z));
x += speed * sin(angle);
z += speed * cos(angle);
}

Yikes;神圣的悬挂指针,蝙蝠侠!

projectiles.push_back(&Projectile(&m, x, 2, y));

您似乎试图存储指向的指针,不仅是本地变量,还有临时对象!不确定在该行执行完毕后,您希望这些指针引用什么。

不过,我看不到你在任何地方存储引用(这很好)。

你基本上必须在这里使用动态分配,这样你就可以自己管理这些对象的生存期,尽管我建议你使用智能指针类型,这样你不必承担太多的责任:

vector<unique_ptr<Projectile>> projectiles;
// ...
projectiles.emplace_back(new Projectile(&m, x, 2, y));

请确保您也知道m的寿命。总的来说,我建议仔细检查一下你的所有对象,并弄清楚:

  • 哪段代码负责它们的生命周期,以及
  • 那一生是什么

在你开始向所有东西抛出指针之前。:)


特别地,避免了对delete的需要

你不能这样做:

projectiles.push_back(&Projectile(&m, x, 2, y));

您实际要做的是创建一个Projectile类型的变量,将其地址传递到向量对象中,然后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_ptrshared_ptr这样的智能指针来管理对象的删除。

如果您坚持使用原始指针,但正在使用Boost,那么您也可以使用ptr_vector类来处理删除。

您正在将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)));