神秘的移动指针

主要观点:工作中开始代码库现代化进程,从 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可保持稳定。

阅读 10
0 条评论