使用std :: cin会使std :: vector :: push_back在msvc上失败,但在clang上不会失败

时间:2020-11-07 11:46:20

标签: c++ visual-c++ clang++

我有一个Graph类,如下所示:

struct Graph
{
  private:
    std::vector<std::vector<uint16_t>> _edges;
    uint16_t                           _numVertices;

  public:
    Graph(uint16_t numVertices) :
        _edges(numVertices),
        _numVertices { numVertices }
    {}

  public:
    void AddEdgeByOneBasedIdx(uint16_t vertexFrom, uint16_t vertexTo)
    {
        assert(vertexFrom != 0 && vertexFrom <= _numVertices);
        assert(vertexTo != 0 && vertexTo <= _numVertices);

        _edges[vertexFrom - 1].push_back(vertexTo - 1);
    }
};

并且程序在std::vector::capacity的{​​{1}}中调用的std::vector::push_back中引发异常,如下所示:

enter image description here

这是引发异常时的调用堆栈:

enter image description here

这是输入:

Graph::AddEdgeByOneBasedIdx

主要功能就是这样。

3 2
3 2
1 3

我看到了反汇编窗口,发现生成的汇编代码是错误的。

enter image description here

生成的汇编代码具有int main() { std::ios::sync_with_stdio(false); uint16_t numVertices; uint32_t numEdges; std::cin >> numVertices >> numEdges; Graph graph { numVertices }; for (uint32_t i = 0; i < numEdges; ++i) { uint16_t vertexFrom, vertexTo; std::cin >> vertexFrom >> vertexTo; graph.AddEdgeByOneBasedIdx(vertexFrom, vertexTo); } } ,在调用函数指针时使用。我尝试了几个示例,发现使用call rax会使MSVC生成错误的汇编代码。当主要功能如下时,程序运行良好。

std::cin

所以我想知道我的代码是错误的,还是存在已知的错误。使用clang时不会发生这种情况。我在Windows 10 20H2上使用Visual Studio Community 2019 16.7.7和clang 10.0.0。感谢您的提前答复。

1 个答案:

答案 0 :(得分:0)

~~我修复了Visual Studio,现在问题已解决。似乎SDK并不完整。~~

编辑:

修复SDK后,再次发生相同的错误。我重新安装了Visual Studio,并且再次弹出相同的错误。我不知道原因,所以我改用clang 11。

相关问题