大输入分段故障

时间:2011-09-22 16:28:18

标签: c++ segmentation-fault

我知道segmentation fault表示该进程已尝试访问不允许的某些内存。

我正在使用C ++运行其他人编写的程序。当我的输入很大(大约1GB)时,即使我要求30GB内存,也会出现分段错误;而当输入尺寸非常小时,它会很顺利。

那我该怎么办?是因为内存不足吗?我真的是一个没有太多C ++知识的新手。我甚至不知道代码的哪一部分控制了内存分配。

感谢BLender,来自调试的行是:

Program received signal SIGSEGV, Segmentation fault. 0x0000003fbd653174 in _IO_vfscanf_internal () from /share/bin/intel/cc/10.1.015/lib/tls/x86_64/libc.so.6

4 个答案:

答案 0 :(得分:1)

  

即使我要求30GB内存

30GB的内存吗?我真的怀疑它。

答案取决于程序的功能。如果程序在没有内存的情况下读取和处理数据(即,之前读取的数据不影响正在读取的数据的处理),则可以以块的形式加载文件。

但是没有细节,我不能说更多。


调试你的程序。编译时,启用调试:

g++ -g -o program -Wall program.cpp 

并使用gdb进行调试:

gdb program
(gdb) run

导致段错误的行号和功能应该出现。

答案 1 :(得分:1)

您的代码多次调用malloc,但从不调用free,因此它会占用大量内存。它永远不会检查内存不足的情况......

我的建议是将所有对malloc的调用更改为:

size_t total_memory = 0;
void *my_malloc(size_t sz)
{
    void *res = malloc(sz);
    total_memory += sz;
    if (res == NULL)
    {
        printf("Too much memory eaten: %zu\n", total_memory);
        abort();
    }
    return res;
}
#define malloc(x) my_malloc(x)

看看会发生什么。

答案 2 :(得分:0)

他们很可能在那里有一个固定大小的缓冲区,而你的“大输入”太大而不适合它。默认情况下,C ++不会检查这些内容(如果他们使用了STL中的精确检查数据结构,但很明显他们没有这样做)。

答案 3 :(得分:0)

尝试在调试器中运行程序,但首先要确保使用调试信息(-g)编译它。使用segvaults的数据运行它。可能是你的程序尝试通过调用malloc或new来分配大量内存并将其分配给指针,不检查是否成功然后尝试访问内存(通过指针)分配。通过在调试器中分段违例后检查堆栈跟踪,您可以看到它发生的位置。这应该可以告诉你应该修改程序的哪一部分,例如它不会在整个输入文件中读取,而只是在循环中读取它的一部分。