С ++ несоответствия в векторе указателей на объекты - PullRequest
0 голосов
/ 29 января 2012

У меня проблема в куске кода, который я пишу.Я свел его к этому примеру, который дает те же результаты (в принципе).

По сути, у меня есть вектор указателей на объекты, с которыми я сталкиваюсь в одном классе и передаю другому.Затем я замечаю, что, проходя этот вектор с помощью итератора, я сталкиваюсь со значениями NULL или мусора, в то время как с помощью традиционного прогона цикла для цикла все нормально.И результат этой программы:

0   0
3   4

1   2
3   4

Так что мне интересно, почему объект итератора выдает значения мусора.В других случаях итератор равен NULL.Я предполагаю, что это как-то связано с тем, что некоторые объекты bbject выходят из области видимости при передаче между объектами, но я не могу понять, где и почему.

Спасибо

Ответы [ 2 ]

4 голосов
/ 29 января 2012

holder.getObjectVector() возвращает новый vector. Таким образом, holder.getObjectVector().begin() и holder.getObjectVector.end() не связаны, как существует в цикле for.

Изменение getObjectVector() для возврата ссылки исправит это:

vector<MyObject*>& getObjectVector() { return obj_vector; }

EDIT:

Альтернативой может быть организация вызова getObjectVector() один раз перед циклом for и сохранение результата, и нет необходимости возвращать ссылку:

vector<MyObject*> objs = holder.getObjectVector();
for (vector<MyObject*>::iterator itr = objs.begin(); itr != objs.end(); ++itr)
{
    ...
}
0 голосов
/ 29 января 2012

Исправьте меня, если я ошибаюсь, но я думаю, что в вашем коде:

class MyObjectHolder
{
  public:
    MyObjectHolder()
    {
      Builder builder; <------ this is on local stack (i.e. gone on constructor exit)
      obj_vector = builder.getObjectVector();
    }

    vector<MyObject*> getObjectVector() { return obj_vector; }

  private:
    vector<MyObject*> obj_vector;  <---- so this points to random dynamic memory

};

, и бывает так, что иногда область памяти не используется другим кодом в стеке до того, как на него ссылаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...