【发布时间】: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