为什么 C++ 分段错误在 Windows 上出现,而在 Linux 上却没有?

问题描述 投票:0回答:1

我的程序有两个版本,一个是 Linux,另一个是 Windows。我注意到有时一个小的内存违规在 Linux 上不会触发任何东西,但在 Windows 上它会引发分段错误。

例如,如果我有

std::vector<int>
有 200 个元素。尝试读取第 200 或第 201 个元素不会导致 Linux 上的崩溃,它将返回一个虚假值,如果这对我的程序不是必需的,程序将继续运行,但在 Windows 10 上,这会立即引发错误。

Windows 似乎有更严格的段错误检测。因为我在 Linux 环境中进行开发,所以恐怕在测试 Windows 版本之前我无法发现程序中的某些问题。有没有办法在 Linux 执行中强制执行同样的严格性?

此外,为什么平台之间会有这种差异?

c++ linux windows segmentation-fault access-violation
1个回答
0
投票

Windows 似乎有更严格的段错误检测

不存在“段错误检测”这样的东西。

如果您尝试读取未映射到您的进程的内存,通常会发生分段错误。那么CPU就无法执行该指令,反而出现故障。向量分配后的内存是否被映射,或者向量过度分配的元素数量是否超过所需数量,是 50% 随机还是 50%,具体取决于

std::vector
的实现细节和所使用的分配器。

无论哪种情况,访问包含 200 个元素的

std::vector
的第 201 个元素都会导致 未定义行为,这意味着即使在同一平台上,也无法以某种方式保证任何特定行为。

如果您需要调试方面的帮助,那么标准库实现通常会提供一个选项来启用调试断言,该断言将在许多情况下立即捕获,例如这种情况。例如,如果您使用 GCC 和 libstdc++ 作为 C++ 标准库实现,请查看

_GLIBCXX_ASSERTIONS
_GLIBCXX_DEBUG
宏。此外,编译器还提供未定义的行为并解决可以捕获其中一些问题的清理程序,例如使用 GCC 编译时使用
-fsanitize=address,undefined

© www.soinside.com 2019 - 2024. All rights reserved.