在 while 循环中使用 "new" 运算符声明指针会对我的计算机产生什么影响?
What would declaring a pointer with the "new" operator within a while loop do to my computer?
所以我最近开始学习 C++,我对内存分配、垃圾收集、堆、堆栈等非常感兴趣...
我写了这个程序,我想知道它会对我的电脑做什么?它会因为我的 RAM 被填满而崩溃吗?它会 运行 慢一点吗?它会在填满太多 ram 之前停止吗?
我太害怕运行在我的机器上安装它了。
#include <iostream>
using namespace std;
int main()
{
while (true) {
int* x = new int;
}
}
编辑:
所以我 运行 我 PC 上的程序,它实际上只是一个 ram eating 程序。我一直这样做,直到 windows 资源管理器失败并且我的桌面变黑了。然后我重启电脑就好了
你首先要面对的是memory leak。
但是您的程序将继续从堆中分配内存并面临内存泄漏,但 OS 将停止您的程序。 OS 中有一个名为 OOM. in this concept if some programme continue to allocate memory and cause some important part of system goes down OS will immediately send SIGKILL 信号的概念。这是导致你的程序被杀死然后释放分配的内存。
它实际上取决于程序所在的主机系统 运行 和编译器。
一些编译器(尤其是启用了优化设置的编译器)足够聪明,可以识别在循环中分配的内存未以影响程序输出的方式使用。然后编译器可能会忽略内存分配,然后可能(因为在 C++ 中什么都不做的无限循环实际上会产生未定义的行为)做任何事情。可能的结果包括程序永远循环(消耗 CPU 个周期但不分配内存),编译器根本不生成循环(因此程序立即终止)。
如果未进行编译器优化(例如未优化的构建),程序可能会循环并重复分配内存。然后会发生什么取决于操作系统。
某些操作系统(例如 unix 变体)可以配置(或默认配置)进行延迟分配或过度提交,从某种意义上说,它们在程序尝试之前不会实际分配虚拟或物理内存非平凡地使用该内存(例如,在其中存储数据)。由于您的循环从不使用它分配的内存,因此在执行惰性分配的系统上,循环可能 运行 无限期 - 除了丢失 CPU 周期外,对主机系统没有明显影响。
如果 OS 没有被配置为延迟分配(例如 实际上 立即分配内存)循环将继续直到分配失败并通过抛出终止程序一个例外。
在此过程中发生的事情再次取决于操作系统。
如果操作系统对进程施加的限额明显小于操作系统可用的总内存(物理或虚拟),则其他进程(以及 OS 本身)可能不受我们计划的影响。
如果操作系统允许程序分配所有可用内存,那么在这个程序中重复分配可能会影响其他程序或操作系统本身的行为。如果操作系统能够检测到这一点,它可能会强制终止程序 - 并且在该过程中,它 可能 回收分配的内存。如果操作系统未检测到该行为并终止该程序,则该程序可能会导致操作系统变慢。
如果您的操作系统本身是托管的(例如在虚拟机管理程序环境中),则操作系统本身可能会终止,但在同一台物理机器上 运行 的其他操作系统实例通常不会受到影响。
新手程序员可以在毫无戒心的机器上运行这样的程序,甚至有点相信机器最终会变慢并可能崩溃,或者需要硬电源循环,这已经至少有二十年了。操作系统设计和更大的系统设计(例如管理程序的常规使用)使此类恶作剧不太可能产生任何持久影响。
所以我最近开始学习 C++,我对内存分配、垃圾收集、堆、堆栈等非常感兴趣...
我写了这个程序,我想知道它会对我的电脑做什么?它会因为我的 RAM 被填满而崩溃吗?它会 运行 慢一点吗?它会在填满太多 ram 之前停止吗?
我太害怕运行在我的机器上安装它了。
#include <iostream>
using namespace std;
int main()
{
while (true) {
int* x = new int;
}
}
编辑:
所以我 运行 我 PC 上的程序,它实际上只是一个 ram eating 程序。我一直这样做,直到 windows 资源管理器失败并且我的桌面变黑了。然后我重启电脑就好了
你首先要面对的是memory leak。
但是您的程序将继续从堆中分配内存并面临内存泄漏,但 OS 将停止您的程序。 OS 中有一个名为 OOM. in this concept if some programme continue to allocate memory and cause some important part of system goes down OS will immediately send SIGKILL 信号的概念。这是导致你的程序被杀死然后释放分配的内存。
它实际上取决于程序所在的主机系统 运行 和编译器。
一些编译器(尤其是启用了优化设置的编译器)足够聪明,可以识别在循环中分配的内存未以影响程序输出的方式使用。然后编译器可能会忽略内存分配,然后可能(因为在 C++ 中什么都不做的无限循环实际上会产生未定义的行为)做任何事情。可能的结果包括程序永远循环(消耗 CPU 个周期但不分配内存),编译器根本不生成循环(因此程序立即终止)。
如果未进行编译器优化(例如未优化的构建),程序可能会循环并重复分配内存。然后会发生什么取决于操作系统。
某些操作系统(例如 unix 变体)可以配置(或默认配置)进行延迟分配或过度提交,从某种意义上说,它们在程序尝试之前不会实际分配虚拟或物理内存非平凡地使用该内存(例如,在其中存储数据)。由于您的循环从不使用它分配的内存,因此在执行惰性分配的系统上,循环可能 运行 无限期 - 除了丢失 CPU 周期外,对主机系统没有明显影响。
如果 OS 没有被配置为延迟分配(例如 实际上 立即分配内存)循环将继续直到分配失败并通过抛出终止程序一个例外。
在此过程中发生的事情再次取决于操作系统。
如果操作系统对进程施加的限额明显小于操作系统可用的总内存(物理或虚拟),则其他进程(以及 OS 本身)可能不受我们计划的影响。
如果操作系统允许程序分配所有可用内存,那么在这个程序中重复分配可能会影响其他程序或操作系统本身的行为。如果操作系统能够检测到这一点,它可能会强制终止程序 - 并且在该过程中,它 可能 回收分配的内存。如果操作系统未检测到该行为并终止该程序,则该程序可能会导致操作系统变慢。
如果您的操作系统本身是托管的(例如在虚拟机管理程序环境中),则操作系统本身可能会终止,但在同一台物理机器上 运行 的其他操作系统实例通常不会受到影响。
新手程序员可以在毫无戒心的机器上运行这样的程序,甚至有点相信机器最终会变慢并可能崩溃,或者需要硬电源循环,这已经至少有二十年了。操作系统设计和更大的系统设计(例如管理程序的常规使用)使此类恶作剧不太可能产生任何持久影响。