C ++ delete并不总是在Windows中按预期工作

时间:2014-04-06 20:54:11

标签: c++ windows memory-management

我对一些非常简单的事情感到非常沮丧(或者我猜),所以非常感谢这方面的帮助。 (对不起,如果这已经得到了解答,我没有幸运地在其他地方找到它,这就是为什么我要问...) 所以,我编写了以下非常简单的程序,用于测试目的。

class myclass{
    int x[99999];
public:
    myclass(){}
};

int main(){
    myclass *x = new myclass;
    delete x;
}

在主线的第1行使用了断点,对我来说很容易(使用视觉效果) studio 2010和windows资源监视器)实现,即删除后调用,即 删除x后,不会释放此程序的保留内存。 如果我将myclass中的x [99999]更改为x [999999](添加额外的9),则确实释放了已分配的内存。我担心这种奇怪的行为(在各种类似的测试中发生),但是 正如预期的那样,这个程序并不是让我担心的...... 我的第一个问题是,我不确定我是否可以信任Windows资源监视器。 它是否真的一直在更新其输出?或者只是在(de)分配了一定数量的空间时?如果是第二个,请您向我推荐一个精确监控资源的工具吗? 其次,我使用了一个程序(我不记得它被称为什么)来检查可执行文件的内存泄漏,对于我的一个更大的项目。没有发现内存泄漏。但是,某个事件会导致非常少量的内存泄漏(根据Windows资源监视器)。每4次调用某个事件就会导致大约1 KB的内存泄漏。 我很确定,我的代码的那部分是正确的,但与上面的例子类似 它保留了少量的内存,这些窗口可能没有“考虑”,当被问到时,可能还不足以解除分配? 或者也许Windows上的每个函数调用都会收集一些系统垃圾? (我不信...) 或者堆调用堆积垃圾? (我也怀疑......) 上面的代码是否释放了它为您的机器预留的内存? 你有什么事要向我提出我的特殊情况吗? 请不要开始讲述堆栈,堆以及它们的工作方式。 从理论上讲,我很清楚这一切。它实际上并没有完全像那样。提前谢谢你,如果我的英语不完美(不是我的母语),请对不起。

2 个答案:

答案 0 :(得分:4)

您已经提出了许多大多数无关的问题。让我试着澄清你的主要问题:

该过程具有内存管理代码,可以明智地决定何时将虚拟内存返回给操作系统以及何时保留它以防以后需要它。由于虚拟内存(地址空间)通常不被认为是稀缺资源,因此您没有特别的理由希望该过程释放它。操作系统将物理内存(RAM,即珍贵的内容)始终放在最佳使用状态,无论进程如何处理,都将其提供给流程,并将其从流程中认为最佳。虚拟内存。

答案 1 :(得分:3)

'delete'不会将内存返回给Windows。所以Windows工具不会显示正在发生的事情。您的运行时库(进程的一部分,而不是操作系统的一部分)会保留该内存,以便在将来的“新”请求中重用。