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

Posted

技术标签:

【中文标题】如果我在使用新程序和结束程序分配数据后没有调用删除运算符会发生啥?【英文标题】:What happens if I didn't call delete operator after allocating data using new and ending program?如果我在使用新程序和结束程序分配数据后没有调用删除运算符会发生什么? 【发布时间】:2011-08-10 23:15:21 【问题描述】:

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

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

注意:我运行的是 Windows XP。

【问题讨论】:

您能否详细介绍一下您在测试程序结束后发现性能不佳的 PC 的哪些情况? 没有什么特别的,打开控制面板、资源管理器或启动另一个程序,所有任务都需要比以往更多的时间。 定义nausea。你如何测量slow。内存本身没有问题,这将被重新声明。它保留的其他资源是因为没有调用对象析构函数来整齐地关闭这些资源(如果没有正确关闭,示例套接字可能会在一两分钟内重新保持不可用)。 What REALLY happens when you don't free after malloc? 的可能重复项 【参考方案1】:

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

【讨论】:

为什么PC似乎有恶心xD,我的意思是它很慢但是一段时间后它的性能变得更好但不像程序执行之前那样 @mavric 我想这取决于进程使用的资源。例如,如果进程使用了​​大量内存,它可能会迫使操作系统换出很多东西。换回来需要时间。 这只是猜测 其实我做了一个程序来故意泄漏内存,只是为了教育目的。所以我让它分配并且不释放一个巨大的内存(页面文件使用量跳到它的最大值)。无论如何,我试图等待时间会好转,但它没有......【参考方案2】:

我认为您已经看到了将有用程序从主内存移到磁盘的效果。

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

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

【讨论】:

【参考方案3】:

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

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

总而言之,操作系统做了正确的事情并回收了内存。泄漏的软件很糟糕。但在某些情况下,这并不重要。

【讨论】:

其实我做了一个程序来故意泄漏内存,只是为了教育目的。在我关闭程序后,任务管理器显示内存已重新返回给操作系统,但系统性能并没有像执行程序之前那样恢复。我找不到为什么会这样?!! 你泄露了多少?性能是一个模糊的术语 - 你能具体一点吗? while(i 你的电脑有多少内存?我认为 double 至少是 8 个字节,所以你分配 .. >2GB?每次迭代? 1 GB 内存。除了虚拟内存,它跳到 2.03 GB。【参考方案4】:

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

【讨论】:

为什么PC似乎有恶心xD,我的意思是它很慢但是一段时间后它的性能变得更好但不像程序执行之前那样【参考方案5】:

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

【讨论】:

为什么PC似乎有恶心xD,我的意思是它很慢但是一段时间后它的性能变得更好但不像程序执行之前那样【参考方案6】:

内存本身没有问题,会自动回收。

由于没有整齐地调用对象析构函数(因为您没有删除未调用析构函数的内存),因此保留了其他资源。关闭这些资源。

简单的例子是:

如果未正确关闭,套接字可能会在一两分钟内无法使用。 数据库句柄可能会导致数据库用尽其所有连接。 空间站因线路上的静电而旋转出轨道。

【讨论】:

以上是关于如果我在使用新程序和结束程序分配数据后没有调用删除运算符会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 在删除 CoreData 中的对象后尝试保存新对象时应用程序崩溃

对象指针

C/C++程序内存的分配

java程序,每隔3秒查询30条数据出来,对每条数据进行处理,处理完删除数据,查询数据时有时候报异常

主线程结束后如何保持任务运行?

更新了核心数据模型,没有新版本,如何修复?