Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存耗尽是否会导致分段错误?_C++_C_Segmentation Fault - Fatal编程技术网

C++ 内存耗尽是否会导致分段错误?

C++ 内存耗尽是否会导致分段错误?,c++,c,segmentation-fault,C++,C,Segmentation Fault,我正在解决codechef上的一个问题 我已经编写了问题的算法,并且在测试用例上运行良好。虽然,当我在codechef(在线)上运行它时,它抛出了分段错误 我仔细检查了一下,我没有访问任何不可访问的内存位置,尽管我怀疑我的程序可能占用了大量内存 所以,我的问题是,当没有更多的内存可供程序执行时,是否可以抛出分段错误。类似于C#中的OutOfMemoryException,这取决于分配内存的方式以及执行此操作时是否检查错误。例如,malloc在内存不足的情况下将返回NULL。检查失败,可能导致取消

我正在解决codechef上的一个问题

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

我仔细检查了一下,我没有访问任何不可访问的内存位置,尽管我怀疑我的程序可能占用了大量内存


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

中的
OutOfMemoryException
,这取决于分配内存的方式以及执行此操作时是否检查错误。例如,
malloc
在内存不足的情况下将返回
NULL
。检查失败,可能导致取消引用
NULL
,从而导致分段错误。如果C++使用<代码>新< /COD>,它将引发异常。


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

正如Kerrek在评论中提到的,使用过多自动存储或调用堆栈太深可能导致SEG故障,例如():

或():

#包括
int main()
{
INTA[50000000];

实际上有两种情况

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


intmain(){
试一试{
std::阵列arr;

如果堆栈溢出,即大量的自动存储和/或深度递归函数调用,是否会发生这种情况。@KerrekSB谢谢,我会研究它“我怀疑我的程序可能占用了大量内存”您最好知道您的程序消耗了多少内存。(1)通常是的,(2)通常不会。这两个答案对标记中提到的两种语言都有效,但顺序未明。请知道您使用的是哪种语言。@alk当我事先不知道提供给它的数据量时,我如何确切地知道我的程序消耗了多少内存。
void foo(){ foo(); }

int main() {
    foo();
    return 0;
}
#include <iostream>
int main()
{
    int a[50000000];        
    std::cout << a[500];    
}
int main() {
    try {
        std::array<int,10000000> arr;
        cout << arr[40] << endl;
    }
    catch(const std::exception& e) {
        cout << e.what() << endl;
    }
    return 0;
}
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;
}