内存耗尽会导致分段错误吗?

时间:2014-08-03 10:02:11

标签: c++ c segmentation-fault

我正在解决codechef上的问题。

我编写了问题的算法,并且它在测试用例上运行良好。虽然,当我在codechef(在线)上运行它时,它会引发分段错误。

我已经仔细检查过,我没有访问任何无法访问的内存位置,虽然我怀疑我的程序可能占用了大量内存。

所以,我的问题是,当没有更多可用于程序执行的内存时,可以抛出分段错误。类似于C#中的OutOfMemoryException

3 个答案:

答案 0 :(得分:1)

这取决于您分配内存的方式以及在执行此操作时是否检查错误。例如。 malloc会在内存不足的情况下返回NULL。未能检查可能导致解除引用NULL,这将导致分段错误。如果使用C ++的new,则会抛出异常。

实际上,虽然当程序执行过多的内存分配时,它通常会使系统RAM过度使用,并且在malloc开始返回NULL之前,它的进程会被OOM杀手杀死 - 除非大多数分配的内存实际上是未使用的。

答案 1 :(得分:1)

正如Kerrek在评论中提到的那样,过度使用自动存储或过深的调用堆栈会导致SEG错误,例如(on coliru):

void foo(){ foo(); }

int main() {
    foo();
    return 0;
}

或(on coliru):

#include <iostream>
int main()
{
    int a[50000000];        
    std::cout << a[500];    
}

总而言之,你必须要意识到你的系统限制,例如一些递归暴力解决方案有时理论上确定并且应该有效但是相当不切实际(是的,这是模糊的例子,但OP没有提到正在解决的问题,也没有提到如何让上述至少某些背景......)。

答案 2 :(得分:0)

实际上有两种情况

1。您尝试从调用堆栈中分配太多,然后您将收到一个信号。无法捕获例外


int main() {
    try {
        std::array<int,10000000> arr;
        cout << arr[40] << endl;
    }
    catch(const std::exception& e) {
        cout << e.what() << endl;
    }
    return 0;
}

2. 您尝试分配过多的动态内存,然后您将收到异常


int main() {
    try {
        std::vector<int> arr;
        arr.resize(1000000000);
        cout << arr[40] << endl;
    }
    catch(const std::exception& e) {
        cout << e.what() << endl;
    }
    return 0;
}

您可以尝试live on ideone