【发布时间】:2022-01-08 09:14:35
【问题描述】:
我目前正在学习 C++。在一些堆分配练习中,我试图生成错误的分配。我的物理内存大约是 38GB。为什么可以分配如此大量的内存?我对字节的基本计算是错误的吗?我不明白。任何人都可以给我一个提示吗?谢谢。
#include <iostream>
int main(int argc, char **argv){
const size_t MAXLOOPS {1'000'000'000};
const size_t NUMINTS {2'000'000'000};
int* p_memory {nullptr};
std::cout << "Starting program heap_overflow.cpp" << std::endl;
std::cout << "Max Loops: " << MAXLOOPS << std::endl;
std::cout << "Number of Int per allocation: " << NUMINTS << std::endl;
for(size_t loop=0; loop<MAXLOOPS; ++loop){
std::cout << "Trying to allocate new heap in loop " << loop
<< ". current allocated mem = " << (NUMINTS * loop * sizeof(int))
<< " Bytes." << std::endl;
p_memory = new (std::nothrow) int[NUMINTS];
if (nullptr != p_memory)
std::cout << "Mem Allocation ok." << std::endl;
else {
std::cout << "Mem Allocation FAILED!." << std::endl;
break;
}
}
return 0;
}
输出:
...
Trying to allocate new heap in loop 17590. current allocated mem = 140720000000000 Bytes.
Mem Allocation ok.
Trying to allocate new heap in loop 17591. current allocated mem = 140728000000000 Bytes.
Mem Allocation FAILED!.
【问题讨论】:
-
这就是您所看到的:en.wikipedia.org/wiki/Virtual_memory。基本上,当您不访问它时,操作系统可以将内存“交换”到磁盘。如果您再次需要它,它将确保它被“交换”到内存中。
-
因为物理页面在 + 之前是不分配的,除非你触及你的地址空间。实际上,最初发生的是内核的描述进程地址空间的数据结构被扩展。就这样。只有在您从新的虚拟地址空间加载/存储时,才会发生一些事情——页面错误。 CPU检查TLB,然后检查页表,仍然没有发现,切换到特权模式并跳转到内核,内核实现“OK,这实际上是允许的”,将物理页面映射到虚拟页面 - 那么你真的在使用物理内存。
-
表达相同原则的另一种方式:未触及的虚拟地址空间保持“纯”虚拟,没有物理内存支持(具有每(巨型)页面粒度)。
-
感谢您的解释,我想我现在明白了。我将深入研究该主题以增强我的知识。也感谢您的链接。
标签: c++ memory-management