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

标签 c++ windows memory crash

我正在尝试掌握 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/

相关文章:

c++ - 是否可以在 C++ 中测试属性说明符?

c# - 如何更改特定类型的单个文件的图标?

c - 我如何知道我的 mmaped 分配的范围?

c++ - 一些运算符是 Lua 不允许的

c++ - 通过发音查找相似词 - 算法、方法、库

c++ - 如何在 Windows 上阻止到某个端口的环回连接?

windows - 最后一个参数中的正斜杠会导致批处理文件 ("%~dp0") 的目录路径发生更改

java - Android Webview JNI 错误与 loadUrl

c - 在 C 中,动态分配的字符串文字的间接操作是如何真正工作的?

c++ - 在计算 constexpr 时抛出异常会发生什么?