【发布时间】:2017-09-14 07:03:38
【问题描述】:
以下 C++ 为包含巨大整数数组的对象动态分配内存。
#include <iostream>
// VALUE1 > 1000000
class Int{
int* p = new int[VALUE1];
};
int main() {
// VALUE2 > 1000000
Int* ppi = new Int[VALUE2];
while(true){
}
}
我的理解是内存是在堆中分配的(很大)。程序向操作系统请求内存并处理内存分配。所以,我的问题是,如果它没有可用的内存资源,为什么操作系统不拒绝程序的内存(这会使其崩溃)?这是操作系统的工作。上面的程序让我的电脑死机。如果这很重要,我在 linux 4.9 上有 8 GB RAM。
【问题讨论】:
-
我猜电脑死机是因为它忙于在
while(true){}中无所事事。由于从未使用过p和ppi,它们可能已被编译器优化掉。 -
你确定编译器不只是优化分配,因为你什么都不做吗?
-
或者可能变成了一个虚拟内存请求,在页面被访问之前不会提交页面。
-
我没有提供优化标志,因为我只是在摆弄以检查会发生什么。它冻结了整个计算机,我不得不强制关机。编译器是否优化了动态内存分配?
-
您应该检查内核过度使用值设置为(默认为 0)
/proc/sys/vm/overcommit_memory...
标签: c++ memory memory-management operating-system