美好的一天,
我正在用C ++尝试新东西,我发现Visual Studio中的Debug和Release配置给了我不同的结果。
#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中的一行。
但是在Release中,当我在向量中打印第一个字符串时,它会在最后一行崩溃
当我尝试调试它时,我发现变量myVector被“优化掉了,不可用”。在发布。我认为这不是正确的优化。
此外,我发现如果我改变一行:
for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt", [&myVector](std::string& var) { return var; }))
它编译正确。但是在lambda函数中不需要变量myVector,对吗?
我的代码或MSVC编译器有问题吗?我尝试了VS 2015 Update 1(第一个VS协同程序)和VS“15”每天构建的VC ++。
谢谢你,
MiroslavHrnčíř
P.S。我很抱歉我的英语不好,如果这是一个愚蠢的问题。
答案 0 :(得分:1)
听起来这是你文件路径的问题......你可能无法读取文件,导致矢量没有被填充,然后矢量[0]超出范围。
VS将发布版本和调试版本放在不同的目录中,这意味着当您使用调试版本运行时打开的文件与您使用的相同路径不存在。
尝试使用完整路径更新它,然后看看会发生什么