Проблема времени жизни объекта с циклом for на основе диапазона

В настоящее время я преобразовываю свой код в С++ 11, и у меня возникают проблемы со следующим циклом for на основе диапазона (FWIW, тот же код раньше работал нормально с BOOST for_each).

Элемент mLibraryFiles (вектор STL) является частью экземпляра singleton и гарантированно существует после возврата метода, однако, когда вызывающий объект проверяет возвращенный объект, он содержит только мусор.

Отладка через него, похоже, превращается из ожидаемого содержимого в мусор сразу после возврата из метода, поэтому я полагаю, что, должно быть, я что-то неправильно понял о том, как на самом деле работает цикл на основе диапазона С++ 11:

Entry* FindEntry(string inName)
{  Entry *rs = NULL;

   for (auto libraryEntry : mLibraryFiles)
   {
      if (libraryEntry.filename.compare(inName) == 0)
      {
         rs = &libraryEntry;
         break;
      }
   }

   return rs;
}

Я ожидал, что переменная libraryEntry представляет фактические объекты в векторе mLibraryFiles?

Приветствуется любая информация!
(компилятор - LLVM 5.0, хотя я сомневаюсь, что это имеет значение..)


person Jay    schedule 18.01.2014    source источник
comment
libraryEntry является копией элемента mLibraryFiles. Вместо этого используйте for (auto& libraryEntry : mLibraryFiles).   -  person Casey    schedule 18.01.2014
comment
llvm в настоящее время не имеет версии 3.4. Ты наверное имеешь в виду лязг?   -  person Nil    schedule 18.01.2014
comment
@Nil Apple использует отдельную схему нумерации версий для своих выпусков LLVM. (И да, LLVM в настоящее время имеет версию 3.4.) Релизы Apple не Они не обязательно совпадают с выпусками LLVM основной ветки разработки, поэтому они используют другую схему нумерации, чтобы избежать путаницы.   -  person Casey    schedule 18.01.2014
comment
Ах! Полезно знать, спасибо.   -  person Nil    schedule 18.01.2014
comment
@Nil Да, извините за путаницу - версия, показанная в Xcode 5, в которой указано Apple LLVM 5.0   -  person Jay    schedule 18.01.2014
comment
И так как я здесь печатаю материал, я говорю вам, что (при условии, что libraryEntry.filename является std::string) вы можете заменить libraryEntry.filename.compare(inName) == 0 эквивалентным libraryEntry.filename == inName.   -  person Casey    schedule 18.01.2014
comment
@Casey True - спасибо, что указали на это! Все еще слишком много кода char[] в этом проекте, ожидающем «обновления» до реальных объектов.   -  person Jay    schedule 18.01.2014


Ответы (2)


Значения из вашего вектора копируются в libraryEntry в цикле, поэтому у вас есть указатель на скопированное значение, которого больше не существует после цикла. Используйте 1_.

person Wojtek Surowka    schedule 18.01.2014

Объявите libraryEntry как auto&, иначе это временная копия, время жизни которой привязано к циклу for. Вот почему я предпочитаю писать фактический тип объекта вместо auto

person Sebastian Hoffmann    schedule 18.01.2014
comment
Херб Саттер советует использовать auto всегда, когда это возможно, и избегать использования фактического типа. Это дает вам гибкость typedef бесплатно. - person Ezra; 18.01.2014
comment
Написание фактического типа, также без &, будет таким же плохим. - person Yakk - Adam Nevraumont; 18.01.2014