如何解决使用std :: cin会使std :: vector :: push_back在msvc上失败,但在clang上不会失败
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
中引发异常,如下所示:
这是引发异常时的调用堆栈:
这是输入:
Graph::AddEdgeByOneBasedIdx
主要功能就是这样。
3 2
3 2
1 3
生成的汇编代码具有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。感谢您的提前答复。
解决方法
~~我修复了Visual Studio,现在问题已解决。似乎SDK并不完整。~~
编辑:
修复SDK后,再次发生相同的错误。我重新安装了Visual Studio,并且再次弹出相同的错误。我不知道原因,所以我改用clang 11。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。