gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:45:04 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

关于C++ delete 在 Windows 中并不总是按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22899897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com