存储对指针的引用
Storing references to a pointer
我需要创建一个类的许多实例,我觉得向量可以根据我的需要来创建这些实例。我读到向量只存储一个副本,这不是我想要的,因为我需要能够在类中访问和计算。我试过存储指针,但也不起作用。
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_ptr
或shared_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)));
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题