如果我在使用新的和结束的程序分配数据后没有调用删除运算符,会发生什么情况?

What happens if I didn't call delete operator after allocating data using new and ending program?

本文关键字:运算符 调用 删除 什么情况 数据 如果 分配 程序 结束      更新时间:2023-10-16

如果在使用new分配数据后没有调用delete操作符会发生什么?我知道已经分配的数据在释放之前是不可用的,但是在结束程序之后呢?

为什么PC似乎有恶心xD,我的意思是它很慢,但过了一段时间它的性能变得更好,但不像之前的程序执行?

当程序结束时,它所请求的所有内存(堆栈、堆等)将被操作系统占用。

我想你已经看到了将有用的程序从主存驱逐到磁盘的效果。

您故意泄漏的程序试图分配系统上的所有内存。为了满足你的程序的需求,Windows会在系统中寻找其他程序,将它们的内存写入页面文件,并将它们的内存重新分配给你的程序。当你看到页面文件的使用率跳到最大值时,这是因为大多数其他程序都被塞进了主存,而不是主存。

当你的程序退出时,Windows会回收所有程序的内存(如其他人所指出的)。但是计算机上所有其他程序的内存仍然保存在磁盘上的页面文件中,而不是在主内存中。因此,当它们运行时,Windows必须从磁盘加载它们的内存页面,这使得程序看起来很慢。一段时间后,程序将移回主存,性能将恢复正常。

假设您编写了自己版本的'ls'命令,并且内存管理非常差,每次运行都会泄漏10 MB,这是一个很大的泄漏。这有关系吗?不是真的。当程序退出时,系统将回收所有内存,这很可能是程序启动后的几分之一秒。当然,你的自尊心会受到影响,工艺也会降低,但系统不会受到影响。用户可能永远不会知道内存管理有多糟糕。

现在假设您编写了自己的Apache版本。预计它一次可以运行几个月而不需要重新启动,所以即使它泄漏了少量内存,也会随着时间的推移而累积并导致问题。用户可能知道这一点。系统管理员当然会。

总结一下,操作系统做了正确的事情,回收了内存。有漏洞的软件是不好的。但在某些情况下,这并不重要。

程序分配但未释放的所有内存将在程序结束时自动释放。也就是说,在你的程序完成后,它不再对操作系统有任何影响。

堆和堆栈内存分配给每个进程。动态分配发生在堆上。每个可执行文件或程序在一个进程中运行。因此,一旦程序结束,堆和为该进程分配的堆栈就会返回给操作系统。这包括泄漏动态内存。
一旦程序结束,它应该对操作系统的性能没有影响。

内存本身不是问题,它将自动重新声明。

是其他资源,因为对象析构函数没有被整齐地调用(因为没有删除内存,所以析构函数没有被调用)。关闭这些资源

简单的例子有:

  • 套接字如果没有正确关闭,可能会在一两分钟内无法使用。
  • DB句柄可能导致DB耗尽所有连接。由于线路上的静电,空间站旋转出轨道。