主要观点:工作中开始代码库现代化进程,从 Visual Studio 2013 升级到 2022,此过程中语言变化可能导致现有软件故障,如一个专为 Windows 构建的软件升级后某重要类引发段错误。
关键信息:一段描述问题代码的示例,涉及节点存储连接等结构;解释段错误原因是std::vector
扩容时元素复制而非移动,导致std::list
元素复制使指针失效;2013 年的 MSVC 有移动构造但无noexcept
,2015 年才有较完整 C++11 实现;简单解决办法是将std::vector
改为std::list
。
重要细节:代码中Node
结构存储连接,Connection
结构包含节点指针,Graph
结构包含节点列表;std::vector
扩容时若元素类无is_nothrow_move_constructible
特性会复制元素;MSVC 2013 存在一些标准实现缺失;最初未质疑节点被复制的原因,升级后“正确”行为破坏代码,改为std::list
可保持稳定。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。