gpt4 book ai didi

c++ - 如何(故意)使用 new 在 C++ 中导致程序崩溃

转载 作者:可可西里 更新时间:2023-11-01 10:34:43 32 4
gpt4 key购买 nike

我正在尝试掌握 C++ 内存管理的窍门,并尝试使用无限循环的新语句故意使我的程序崩溃。据我了解,这只会在内存堆上保留越来越多的空间。但是我的程序不会崩溃。在 Windows 任务管理器中监控它,它将使用大约 6GB 的内存,但随后下降到 5GB,再次上升到 6GB,等等。

与此同时,我的硬盘很快就满了。我在分配了大约 30GB 后停止了测试,因为我不想对我的 SSD 造成太大的压力。

现在,我有 8GB 的​​ RAM,根据 Windows 设置,“虚拟内存大小”(我猜是交换空间,对吧?)约为 1.5GB。然而,我能够分配的远不止于此。是什么决定了程序最终是否会崩溃?它使用了什么内存?

谢谢!

#include <iostream>
using namespace std;

int main() {
long alloced = 0;
while (true) {
double *d = new double[12500000];
alloced += 1;
cout << alloced << " times 100MB" << endl;
}
return 0;
}

最佳答案

Now, I have 8GB of RAM and according to Windows settings, the "virtual memory size" (I guess it's the swap, right?) is about ~1.5GB.

这是一个常见的混淆。 Windows恰好通过其虚拟内存系统实现交换,而这恰好是Windows虚拟内存系统中唯一可配置的设置。这导致很多人认为交换与虚拟内存相同。

这是不正确的。交换是在虚拟内存出现之前发明的,并且有许多具有虚拟内存的系统根本没有交换(大多数家用 WiFi 路由器)。它们是完全不同的东西。

您所说的 1.5GB 是页面文件的大小。

However I was able to allocate much more than that. What determines whether the program will finally crash? What memory did it use?

它使用虚拟内存,64 位操作系统可以创建数 TB 的虚拟内存。这不是稀缺资源。

要让您的程序崩溃,您需要使用 内存,而不仅仅是分配它。某些操作系统确实允许您对进程施加虚拟内存限制,但我不确定 Windows 是否属于其中之一。 (这通常不是一个好主意。)

关于c++ - 如何(故意)使用 new 在 C++ 中导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33510011/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com