我有下一个程序部分,不能不知道那里到底出了什么问题。我生成了一些Entity对象,我发现它很好并且已经完全初始化了,然后我将这个对象推入空向量_goodPopulation并看到确保_goodPopulation [0]以相同的方式初始化,但是在程序控制返回到其他方法之后class _goodPopulation [0]突然变得没有初始化......为什么?
//的.h
std::vector<Entity*> _goodPopulation;
...
//。CPP
bool ChallengeManager::SelectGoodEnteties(double targetEffectivity)
{
for (...)
{
Entity& ent = _entityGenerator->GenerateEntity();
if (ent.GetEffectiveness() > 0) {
_goodPopulation.push_back(&Entity(ent)); //coping Entity that was generated
Entity* ent2 = _goodPopulation[0];// Just for debugging - Entity object is correct there and fully initialized
if (ent.GetEffectiveness() > targetEffectivity)
{
return true;
}
}
}
return false;
}
Entity* ChallengeManager::AchiveEffectivity(double targetEffectivity)
{
while (true)
{
if (SelectGoodEnteties(targetEffectivity)) {
Entity* ent2 = _goodPopulation[0]; // Here _goodPopulation[0] Entity suddenly became uninitialized, all it fields are random numbers
return _goodPopulation[_goodPopulation.size() - 1];
}
}
}
答案 0 :(得分:4)
您正在向量中存储指针,并且您在此处推送临时地址:
_goodPopulation.push_back(&Entity(ent));
// ^^^^^^^^^^^ Temporary Entity object
指向的对象不再立即存在,留下一个悬垂的指针。取消引用它是未定义的行为。无论你推动什么,都必须指向一个足够长的物体,以便被解除引用。
可以是你的意思
_goodPopulation.push_back(&ent);
如果_entityGenerator->GenerateEntity();
返回的引用有效的时间足够长,那么它将起作用。
答案 1 :(得分:2)
_goodPopulation.push_back(&Entity(ent));
在此行上,您将在堆栈上创建一个局部变量Entity(ent)并获取其地址。一旦你超出范围,本地变量就会被销毁,地址就不再有效了。
所以你应该在堆中创建一个新对象
_goodPopulation.push_back(new Entity(ent));
当您不再需要它们时,不要忘记删除矢量中的对象。
for (std::vector<Entity*>::iterator it = _goodPopulation.begin(); it != _goodPopulation.end(); ++it)
delete *it;