突然,矢量元素变得未初始化

时间:2014-02-04 07:16:52

标签: c++ vector initialization

我有下一个程序部分,不能不知道那里到底出了什么问题。我生成了一些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];
        }
    }
}

2 个答案:

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