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

标签 c++ memory stl porting allocation

我编写了一些在我的笔记本电脑上运行良好的 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/

相关文章:

memory - 试图了解 ARM 二进制镜像中的加载内存地址 (LMA) 和二进制文件偏移量

c++ - 需要一些建议来选择合适的容器

c - C 语言中未声明的实体如何管理内存?

c++ - 给定一个 std::set::iterator,获取指向下一个元素的迭代器

android - 使用 gstreamer 在 android 上录制音频(使用 Qt5)

c++ - premake5 : how to set runtime library to Multithreaded DLL (/MD) in vs2015

ruby-on-rails - 在 Rails 应用程序中为每个 Passenger 进程创建单独的日志

c++ - 从 STL 集中删除最大元素

c++ - 自定义 vector STL 容器中的 clear() 问题

c++ - 如何将 OpenCV 的测试框架与 CMake 一起使用?