【问题标题】:C++ delete doesn't allways work as expected in windowsC++ 删除在 Windows 中并不总是按预期工作
【发布时间】:2014-04-06 20:54:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 使用vld.codeplex.com 帮助检测内存泄漏。 Windows 可能以某种方式对大型对象进行了一些自动垃圾收集..

标签: c++ windows memory-management


【解决方案1】:

您问了很多大多不相关的问题。让我尝试解决您的主要问题:

该进程具有内存管理代码,可以智能地决定何时将虚拟内存返回给操作系统,以及何时保留它以防以后需要。由于虚拟内存(地址空间)通常不被视为稀缺资源,因此您没有特别的理由希望进程释放它。操作系统始终将物理内存(RAM,珍贵的东西)尽其所能地使用,以它认为最好的方式将其分配给进程并从进程中取出,无论进程对其分配的虚拟内存做了什么。

【讨论】:

  • 嗯,谢谢,这是一个开始...我虽然内存在调用时会立即释放。但是,如果您认为我的问题无关紧要,恐怕您就错了。我只是不想发布很多我现在正在搞砸的事情(当然不是代码),这让我猜我的问题变得一团糟。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多