gpt4 book ai didi

c++ - 是什么导致 C++ STL 列表节点内存分配中的段错误?

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:57 25 4
gpt4 key购买 nike

我编写了一些在我的笔记本电脑上运行良好的 C++ 代码(在 Microsoft 编译器和 MinGW 下的 g++ 下编译)。我正在将它移植到 Unix 机器上。

我在 Unix 机器上用 g++ 和 Intel 的 ipcp 编译过,在这两种情况下,我的程序在运行一段时间后崩溃(段错误)。我可以短时间运行它而不会崩溃。

当我调试时,我发现当程序试图复制一个 STL 列表时会发生崩溃 - 具体来说,当程序试图分配内存以在列表中创建一个新节点时会发生崩溃。我在调试器 (TotalView) 中得到的错误是“分配调用失败或返回的地址为空。”

每次运行时,崩溃并不总是发生在代码中的相同位置,但总是发生在分配调用期间,以在 STL 列表中创建节点。我不认为我的内存不足。我有一些内存泄漏,但它们非常小。还有什么会导致内存分配错误?为什么它发生在 Unix 机器上而不是我的 PC 上?

更新:我使用 MemoryScape 来帮助调试。当我使用保护 block 时,程序运行没有崩溃,进一步表明存在内存问题。最终解决问题的方法是“绘制”分配的内存。原来我正在初始化一个变量,但在我将它用作数组索引之前没有将它设置为一个值。因此,该数组溢出了,因为它正在使用变量内存位置中的任何垃圾——通常是 0 或其他一些小数字,所以没问题。但是当我运行程序足够长的时间时,当我写出数组的边界时,它更有可能持有更大的数字并破坏堆。在我试图在数组中写入一个值的代码行中,用大量数字绘制分配的内存会强制出现段错误,我可以看到绘制的大数字被用作数组索引。

最佳答案

这可能是由堆损坏引起的 - 在代码的其他地方,您正在覆盖释放的内存,或者写入内存分配范围之外的内存(缓冲区溢出,或者在分配的内存开始之前写入)。堆损坏通常会导致不相关位置的崩溃,例如在 STL 代码中。由于您在 unix 平台上,您应该尝试在 valgrind 下运行您的程序以尝试识别原始堆损坏。

关于c++ - 是什么导致 C++ STL 列表节点内存分配中的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8620119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com