C# 确定对象是否已在C中被销毁(即不再在任何地方找到)

C# 确定对象是否已在C中被销毁(即不再在任何地方找到),c#,object,memory-management,memory-leaks,destroy,C#,Object,Memory Management,Memory Leaks,Destroy,我肯定以前有人问过这个问题,我只是不知道该搜索哪个词。在我正在使用的C程序中,我有一个跟踪对象的列表。这些对象也可以通过其他对象的引用显示在屏幕上 有时,当一个对象从列表中删除后,它仍然可以临时用于其他对象,因为它应该是。。。但是,在这些对象完成之后,我想确保对象100%消失,并且不会停留在内存中,仍然被遗忘的对象引用。。。我该怎么做 需要明确的是,这不需要作为附带程序的一部分发生,仅用于调试。通常不能。GC负责幕后的内存管理,它的工作非常具体,最好不要被玩弄。特别是,代码的其他部分可能会保留对

我肯定以前有人问过这个问题,我只是不知道该搜索哪个词。在我正在使用的C程序中,我有一个跟踪对象的列表。这些对象也可以通过其他对象的引用显示在屏幕上

有时,当一个对象从列表中删除后,它仍然可以临时用于其他对象,因为它应该是。。。但是,在这些对象完成之后,我想确保对象100%消失,并且不会停留在内存中,仍然被遗忘的对象引用。。。我该怎么做


需要明确的是,这不需要作为附带程序的一部分发生,仅用于调试。

通常不能。GC负责幕后的内存管理,它的工作非常具体,最好不要被玩弄。特别是,代码的其他部分可能会保留对要删除的项的引用,这将阻止其收集。这就是像C这样的内存管理语言的本质

尽管如此,还是有几种方法可以检查对象何时被处置。最简单的方法是创建一个简单的析构函数并对其设置断点,以便在收集对象时查看

~MyClass()
{ // Breakpoint here
}
另一种方法是创建对象的静态列表,每个对象在创建时都订阅该列表。但是,请确保保留另一个列表,因为弱引用是专门为允许垃圾收集而设计的,允许您跟踪对象直至其销毁。另一个列表是保持对象活动所必需的。还要注意的是,在.NET4.5中,有一个。编辑:这绝对是我在看到问题更新后推荐的解决方案。您还可以通过Linq快速查询仍在引用哪些对象

var leftoverObjects = WeakCache
    .Select(wr => wr.Target)
    .OfType<MyObject>() // Only if you're not using that Generic Weak Reference
    .Except(ObjectList); // filters away objects in the List
请注意,上面的查询会创建一个具有强引用的结果,因此一旦运行,只要结果被引用,它就会将这些对象保留在内存中

如果您有某种非托管内存支持您的对象,这正是接口的设计目的


更新:最后,如果您必须这样做,您可以强制GC停止。当您开始扭曲有助于优化GC的代时,通常强烈建议不要这样做。

向后查找对象引用并不容易,基本上您需要使用反射来循环应用程序中存在的所有对象和结构,并检查所有引用。您只需确保所有使用引用的代码在完成时都会真正删除它

检查是否有任何活动引用,但不检查它们的位置的一种方法是保存一个对不再使用的对象的弱引用列表。弱引用不会阻止对象被收集,但您可以使用它们检查对象是否已被收集


由于无法保证在任何特定时间内收集对象,因此您永远无法确定它是否是使对象保持活动状态的实际引用,但对象存活的时间越长,您就越有可能在某个地方有对它的引用。

我想您需要这个用于测试目的。在这种情况下,我建议使用内存分析器,如或。您可以找到更完整的探查器列表

您无法找到。垃圾收集器负责内存管理,您可以尝试强制收集,但不能强制它收集特定对象。我不想强制它收集,我想确保我没有在某个地方对它进行引用,我忘记了。。。我想我应该说得更清楚一些。基本上我不关心对象的引用,除非它实现IDisposable接口,这意味着一些引用可能不会被释放,需要手动处理。除了一些小的.net错误外,内存泄漏几乎是安全的。垃圾收集器不会跟踪你要的信息。谢谢,这正是我需要的。创建了一个具有断点的析构函数,然后在不再引用该对象后强制垃圾收集。我能确认这个物体正在被摧毁是的!我的代码可以工作。谢谢-这比我现在需要的要复杂得多,但我会在将来记住它。