2016-10-05 8 views
1

Добрый день,
Я пробую новые вещи в C++, и я нашел случай, когда конфигурации Debug и Release в Visual Studio дали мне разные результаты.MSVC++ Ошибка или ошибка компиляции с сопрограммами

#include <experimental/generator> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <string> 
#include <vector> 


template <typename T = std::string> 
auto getLineByLine(std::string filename, std::function<T(std::string&)> func = [](std::string& var) { return var; }) 
{ 
    std::ifstream infile(filename); 
    std::string line; 

    while (getline(infile, line)) 
    { 
     yield func(line); 
    } 
} 

int main() 
{ 
    std::vector<std::string> myVector; 
    for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt")) 
    { 
     myVector.push_back(line); 
    } 
    std::cout << myVector[0] << std::endl; 
} 

Этот код в Debug выходов, как и ожидалось - одна строка из файла fileWithMoreThanOneLine.txt.
Но в выпуске он падает на последней строке, когда я печатаю первую строку в векторе.
Когда я попытался отладить его, я обнаружил, что переменная myVector была «оптимизирована и недоступна». в выпуске. Я думаю, что это неправильная оптимизация.

Кроме того, я обнаружил, что если я изменить одну строку в этом:
for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt", [&myVector](std::string& var) { return var; }))
компилирует правильно. Но переменная myVector не нужна в лямбда-функции, правильно?

Является ли эта проблема с моим кодом или компилятором MSVC? Я пробовал VS 2015 Update 1 (первый VS с сопрограммами) и VS «15» с ежедневной сборкой VC++.

Спасибо,
Мирослав Hrnčíř

P.S. Прошу прощения за мой плохой английский, и если это глупый вопрос.

+0

Что такое '' '' '' '' '' '' '' '' '' '' '' '' '' ' – SomeWittyUsername

+0

, а также в вашем текущем коде вы никогда не нажимаете ничего на 'myVector' – Hayt

+0

О, извините, программа оригинальное имя для myVector :( – CdTCzech

ответ

1

Похоже, что это проблема с вашим файловым путем ... вы, вероятно, не можете прочитать файл, в результате чего вектор не заселен, а затем вектор [0] находится за пределами допустимого диапазона.

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

Попробуйте обновить его полный путь, а затем посмотреть, что произойдет

+0

Точно так же - у них разные каталоги запуска, и это просто имя файла. Не могу предположить, что они запускаются из одного и того же места. Плюс, более вероятно, что OP сделал что-то не так, как MSVC выпустила библиотеку, которая не может открывать файлы с помощью сборки релиза. – UKMonkey

+0

Ха-ха, это абсолютно верно. Возможно, файл txt находится только в Debug. Хорошая точка зрения. – AndyG

+0

Спасибо за ответ, но он правильно считывает все в Debug из файла, а режим Release просто включает флаги оптимизации. – CdTCzech

 Смежные вопросы

  • Нет связанных вопросов^_^