【问题标题】:How to (deliberately) cause a program crash in C++ using new如何(故意)使用 new 在 C++ 中导致程序崩溃
【发布时间】:2016-02-04 05:57:44
【问题描述】:

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

【问题讨论】:

  • 它不会崩溃,分配只会失败,指针 d 会得到一个nullptr
  • 在分配 64+ GB(可能是 Windows 许可证的限制)后,我的系统发生了奇怪的事情。你只是不够坚持。 :-)
  • @SHR 在考虑到 David 的提示后,我还为 std::bad_alloc 添加了一个 try/catch 块,以捕获程序何时会耗尽内存。有关更多信息,请参阅我在他的回复下方的评论。

标签: c++ windows memory crash


【解决方案1】:

现在,我有 8GB 的​​ RAM,根据 Windows 设置,“虚拟内存大小”(我猜是交换,对吗?)约为 1.5GB。

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

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

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

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

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

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

【讨论】:

  • 他在分配内存,但只是短暂的。下一个循环将覆盖它。
  • @ott 你是在暗示 OP 的编译器有垃圾收集吗?
  • 感谢您的提醒。所以它基本上只是保留了很多地址?对于我的程序,我还注意到虽然页面文件的 current 大小是 1.5GB,但它实际上设置为 auto,所以它只是增加它,因为更多的内存被要求(在我实施使用内存之后)。我将页面文件设置为 1GB 的固定大小,事实上,程序在很短的时间内就崩溃了。有趣的是,根据 15GB 之后的输出,这不是我所期望的(8GB RAM + 1GB Swap/Pagefile)
  • @AaronMoore Windows 不会过度使用。因此,除非它有足够的后备存储,否则它不会允许可能需要后备存储的分配。
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
相关资源
最近更新 更多