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