如何(故意)使用new在C++中导致程序崩溃
How to (deliberately) cause a program crash in C++ using new
我试图掌握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是否是其中之一。(一般来说,这不是一个好主意。)
相关文章:
- 程序崩溃并显示"std::out_of_range"错误
- 试图创建流或fopen时程序崩溃
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- DLL Made with CMake 使程序崩溃
- 程序崩溃使用boost::asio
- 调用 free() 有时会导致程序崩溃
- 邮件加密程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- For 循环在尝试读取数组 c++ 时程序崩溃
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 无法访问的代码如何导致我的程序崩溃?
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- QCompleter set模型使应用程序崩溃
- 使用唯一指针调用函数会使我的程序崩溃
- 删除SDL_PollEvent时程序崩溃