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

How to (deliberately) cause a program crash in C++ using new

本文关键字:程序 崩溃 C++ 故意 使用 new 如何      更新时间:2023-10-16

我试图掌握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;
}

现在,我有8GB的RAM,根据Windows的设置,"虚拟内存大小"(我想是交换的,对吧?)大约是1.5GB。

这是一个常见的困惑。Windows恰好通过其虚拟内存系统实现交换,而这恰好是Windows虚拟内存系统中唯一可配置的设置。这让很多人认为交换和虚拟内存是一样的。

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

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

然而,我能够分配的远不止这些。是什么决定了程序最终是否会崩溃?它用了什么内存?

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

为了让你的程序崩溃,你需要使用内存,而不仅仅是分配内存。有些操作系统确实允许你对进程施加虚拟内存限制,但我不确定Windows是否是其中之一。(一般来说,这不是一个好主意。)