【发布时间】:2017-02-27 21:46:22
【问题描述】:
我正在研究这个高频制作系统。有一个调用 C++ 库的 C#/CLI 层。我们观察到的是托管对象正在进入垃圾收集器的第 2 代并被“卡住”。最终,由于 RAM 耗尽,C# 应用程序停止运行。这些托管对象是本地对象,应该有很短的生命周期。它们也只被引用一次。 C# 应用程序必须在其所有持有本机资源的对象上调用 .Dispose() 以确保所有内容都被强制删除。我们有很多对象,所以这并不理想,从 API 的角度来看是混乱的。 CLI 如下所示:
Field::~Field()
{
if(m_pField != NULL)
{
delete m_pField;
m_pField = NULL;
}
System::GC::SuppressFinalize(this);
}
Field::!Field()
{
if(m_pField != NULL)
{
delete m_pField;
}
}
谁能想到为什么这些短暂的对象似乎从未被收集并释放内存?
【问题讨论】:
-
它被称为
C++/CLI而不是C#/CLI。确保使用正确的术语,否则在搜索问题的解决方案时将很难找到相关信息。 -
没有多少实际场景可以将临时对象提升到第 2 代。水晶球说终结器线程已死锁。使用非托管调试器查看一下。
-
回想起来,这些东西进入了第 1 代,我们所做的分析是不正确的。 Scotts 的推理是有道理的。
标签: c# garbage-collection c++-cli dispose finalize