即使在堆上,C++ 程序也会因数组过大而崩溃

标签 c++ arrays memory-management crash heap-memory

我正在为三个非常大的数组 (N = 990000001) 分配内存。我知道你必须在堆上分配它,因为它太大了,但即使我这样做了,程序还是会崩溃。我是不是分配不正确,还是我的电脑没有足够的内存(我应该有足够的内存)?另一件可能是问题的事情是我以某种方式错误地分配了我的内存。当 N 很小时,我现在分配内存的方式工作得很好。感谢您的帮助。

int main()
{
double *Ue = new double[N];
double *U = new double[N];
double *X = new double[N];
for (int i = 0; i < N; i++)
{
    X[i] = X0 + dx*i;
    Ue[i] = U0/pow((X0*X[i]),alpha);
}

//Declare Variables
double K1;double K2; double K3; double K4;

//Set Initial Condition
U[0] = U0;
for (int i = 0; i < N-1; i++)
{
    K1 = deriv(U[i],X[i]);
    K2 = deriv(U[i]+0.5*dx*K1,X[i]+0.5*dx);
    K3 = deriv(U[i]+0.5*dx*K2,X[i]+0.5*dx);
    K4 = deriv(U[i]+dx*K3,X[i+1]);
    U[i+1] = U[i] + dx/6*(K1 + 2*K2 + 2*K3 + K4);
}

return 0;
}

最佳答案

您的程序分配并使用了大约 24 GB 的内存。

如果您将程序作为 32 位进程,这将抛出 std::bad_alloc,并且您的程序将正常退出。 (理论上您的工具链中可能存在溢出错误,但我认为这不太可能。)

如果您将程序作为 64 位进程,您可能会被 OOM killer 拦截,并且您的程序将不正常地退出。除非您有 24 GB 的组合 RAM + 交换空间,否则您可能会以磁盘的速度翻滚。 (如果您实际上有 24 GB 的 RAM,那么它可能不会崩溃,所以我们可以排除这种情况。)如果禁用过度使用,那么您将得到 std::bad_alloc 而不是 OOM killer 。 (本段是特定于 Linux 的,尽管其他内核也类似。)

解决方案:使用更少的内存或购买更多的 RAM。

关于即使在堆上,C++ 程序也会因数组过大而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14744664/

相关文章:

c++ - 使用 dfshim.dll 在非托管 C++ 中控制 ClickOnce 应用程序

python - 多维数组索引C++中的多维数组

javascript - 生成从 1 到 5 的给定输入选择可以生成的所有可能序列的列表

C:带有 2D 阵列的 SEGFAULT

c - 循环内的变量和分配

c++ - 如何在 C++ 中实现随机多响应

c++ - 将元组转换为变体

c - 数组指针如何存储它的大小?

python - 从项目列表创建特定形状的 Pandas 数据框

c - 在标准 C 中使用 char 数组存储多种数据类型