C++删除在窗口中无法按预期工作
C++ delete doesn't allways work as expected in windows
我对一些非常简单的事情感到非常沮丧(或者我猜是这样),所以在这件事上的帮助将不胜感激。(对不起,如果这个问题已经得到了回答,我没有运气在其他地方找到它,这就是我问的原因......因此,出于测试目的,我编写了以下非常简单的程序。
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工具不会显示正在发生的事情。运行时库(进程的一部分,而不是操作系统的一部分)保留该内存,以便在将来的"新"请求中重用。
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 编译"运算符删除"时C++编译器如何工作?
- 从列表向量中删除无法按预期工作
- C++自定义删除运算符不能正常工作?
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- "= 删除"如何工作?有人可以解释这个构造函数吗?
- 删除和删除[]在内部如何工作?
- 删除运算符如何在我的代码中工作
- 在删除另一个类中的一个类的对象时析构函数如何工作
- C :删除对象(使用新的),但成员函数仍然可以正常工作(?)
- 当 std::unique_ptr 在手动删除其拥有的对象后超出范围时,它如何工作?
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 更改C 的返回指针后可以删除工作
- 隐式删除的默认构造函数在 C++14 中工作
- 对运算符删除覆盖的工作方式感到困惑
- 在抽象类中删除操作员,它如何工作
- 线程池 - 如何在成员线程完成后删除工作线程(此)
- 为什么被删除=操作员,我该如何工作