【问题标题】:MSVC++ Bad code or compile error with coroutinesMSVC++ 错误代码或使用协程编译错误
【发布时间】:2016-10-05 09:59:59
【问题描述】:

美好的一天,
我在 C++ 中尝试新事物,我发现 Visual Studio 中的调试和发布配置给了我不同的结果。

#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&amp; line : getLineByLine("fileWithMoreThanOneLine.txt", [&amp;myVector](std::string&amp; var) { return var; }))
它编译正确。但是 lambda 函数中不需要变量 myVector 对吧?

这是我的代码或 MSVC 编译器的问题吗?我尝试了 VS 2015 Update 1(第一个带有协程的 VS)和 VS“15”,每天构建 VC++。

谢谢你,
Miroslav Hrnčíř

附:我很抱歉我的英语不好,如果这是一个愚蠢的问题。

【问题讨论】:

  • 什么是program
  • 而且在您当前的代码中,您永远不会将任何内容推送到myVector
  • 抱歉,程序是 myVector 的原始名称 :(
  • 听起来这可能是 MSVC 中的一个问题。只是好奇,如果您将循环更改为for (auto line : getLineByLine("fileWithMoreThanOneLine.txt")) 会怎样?我认为 getLineByLine 返回一个临时的,虽然一个 const ref 不应该根据标准引起问题,也许它是?
  • @AndyG 好主意,但这不是问题。

标签: c++ visual-c++ visual-studio-2015 coroutine


【解决方案1】:

听起来你的文件路径有问题...你可能无法读取文件,导致向量没有被填充,然后向量[0]超出范围。

VS 将发布版本和调试版本放在不同的目录中,这意味着您在使用调试版本运行时打开的文件与您使用的相对路径不同。

尝试用完整路径更新它,然后看看会发生什么

【讨论】:

  • 这正是重点——它们有不同的运行目录,而这只是一个文件名。不能假设他们是从同一个地方跑的。另外,与 MSVC 发布的库无法使用发布版本打开文件相比,OP 更可能做错了这样的事情。
  • 哈哈,完全正确。也许 txt 文件只在 Debug 中。好点子。
  • 感谢您的回复,但它会从文件中正确读取 Debug 中的所有内容,而 Release 模式只会打开优化标志。
  • @CdTCzech:如果使用绝对文件路径会发生什么?
  • 更新了答案以解释为什么路径可能是问题
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多