为什么调用析构函数后对象还在内存快照中

Why Is Object Still In Memory Snapshot After Destructor Called

我正在调查内存泄漏,想知道为什么在调用析构函数后对象计数和大小在内存快照中没有改变。看起来 Inclusive Size 确实下降了,但没有下降到零。有两行,第一行是视图,第二行是它的视图模型。

谁能解释为什么会这样?提前谢谢你。

编辑:写完这个问题后我刚刚拍摄了另一个内存快照(可能大约 5 分钟后),看起来对象现在已经消失了,所以可能只是需要一些时间让所有东西都消失,比如比一些更长的时间析构函数后几秒?

Can anyone explain why . . . the destructor is called the object Count and Size doesn't change in the memory snapshot

.NET 没有析构函数。它有 finalizers which are only indirectly related to memory management. An object with a finalizer cannot be garbage collected until after the finalizer is run (or you call GC.SupressFinalize)。但是该对象在其终结器 运行s.

后不会立即被垃圾回收

当 GC 发现一个(否则)无法访问的对象带有终结器时,对该对象的引用将被放入 freachable 队列,并且终结器线程 运行 对最终到达那里的所有对象设置终结器。该对象将有资格在其终结器 运行 之后的下一个 GC 运行 上进行垃圾回收。请注意,由于该对象已经在 GC 中幸存下来,因此它至少在 Gen1 上。如果它在 Gen2 上,可能需要一段时间才能收集到。

为 C# 终结器重用 C++ 析构函数语法的决定可能是个错误。