C++删除在窗口中无法按预期工作

C++ delete doesn't allways work as expected in windows

本文关键字:工作 删除 窗口 C++      更新时间:2023-10-16

我对一些非常简单的事情感到非常沮丧(或者我猜是这样),所以在这件事上的帮助将不胜感激。(对不起,如果这个问题已经得到了回答,我没有运气在其他地方找到它,这就是我问的原因......因此,出于测试目的,我编写了以下非常简单的程序。

class myclass{
    int x[99999];
public:
    myclass(){}
};
int main(){
    myclass *x = new myclass;
    delete x;
}

在 main 的第一行中使用了断点,这对我来说很容易(使用视觉Studio 2010 和 Windows 资源监视器)来实现,在调用删除后,删除 X 后不会释放此程序的保留内存。如果我将 myclass 中的 x[99999] 更改为 x[999999](添加额外的 9),那么分配的内存确实被释放了。我担心这种特殊的行为(发生在各种类似的测试中),但是正如预期的那样,这个程序并不是我真正担心的......我的第一个问题是,我不确定我是否可以信任Windows资源监视器。它真的一直在更新其输出吗?或者只是在(取消)分配一定数量的空间时?如果是第二个,你能向我推荐一个精确监控资源的工具吗?其次,我使用了一个程序(我不记得它叫什么)来检查可执行文件是否存在内存泄漏,用于我的一个更大的项目。未发现内存泄漏。但是,某个事件会导致非常少量的内存泄漏(根据 Windows 资源监视器)。每 4 次调用某个事件会导致大约 1 KB 的内存泄漏。我很确定,我的那部分代码是正确的,但类似于上面的例子它保留少量内存,Windows 可能"认为"这些内存在被要求时不够值得释放,也许?或者也许窗口上的每个函数调用都会收集一些系统垃圾?(我对此表示怀疑...或者堆调用会积累垃圾?(我也怀疑...上面的代码是否按预期释放了它为您的计算机保留的内存?关于我的特殊情况,你有什么要向我建议的吗?请不要开始谈论堆栈、堆以及它们的工作原理。从理论上讲,我很清楚所有这些。它在实践中并不完全像那样工作。提前谢谢你,如果我的英语不完美(不是我的母语),很抱歉。

你问了很多几乎不相关的问题。让我尝试澄清您的主要问题:

该进程具有内存管理代码,可以智能地决定何时将虚拟内存返回到操作系统,以及何时保留虚拟内存以备日后需要。由于虚拟内存(地址空间)通常不被视为稀缺资源,因此没有特别的理由希望进程释放它。操作系统始终将物理内存(RAM,珍贵的东西)发挥到最佳用途,无论进程如何处理其分配的虚拟内存,它都以它认为最好的方式提供给进程并从中获取它。

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