存储对指针的引用

时间:2014-01-02 02:09:33

标签: c++

我需要创建一个类的多个实例,我觉得它可以根据需要执行。我已经读过一个向量只存储一个不是我想要的副本,因为我需要能够在类中访问和计算。我已经尝试过存储指针,但它也没有用完。

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

3 个答案:

答案 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_ptrshared_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)));