问题描述
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。