C++/CLI定义的类当我实现在C++/CLI DLL的类:内存泄漏,同时使用与终结
public ref class DummyClass
{
protected:
!DummyClass()
{
// some dummy code:
std::cout << "hello" << std::endl;
}
}
,当我加载DLL到C#项目和通过重复地只使用类创建一个对象:
static void Main()
{
while (true)
{
var obj = new DummyClass();
}
}
然后,在运行程序时,内存被缓慢地消化为OutOfMemoryException。
看来,这种内存泄漏(或垃圾收集的糟糕工作)每次在C++/CLI中实现终结器时都会发生。
为什么会发生这种内存泄漏?我怎么能避免它,并仍然能够使用终结器的一些其他(更复杂)的使用?
UPDATE:原因肯定不是以书面控制台/标准输出或在终结其他非标准代码,下面的类具有相同的存储器泄漏行为:
public ref class DummyClass
{
private:
double * ptr;
public:
DummyClass()
{
ptr = new double[5];
}
protected:
!DummyClass()
{
delete [] ptr;
}
}
写入'Console' /'stdout'会导致它。请参阅http://xacc.wordpress.com/2011/02/22/gc-suppressfinalize/以获取我的观察结果和一些评论。 .NET类中的一般规则在终结器中不做任何事情(除了正确实现“IDisposable”)。 – leppie 2013-03-20 11:10:54
我更新了这个问题,所以你可以看到,即使你在终结器中做了你应该做的事情(例如,删除非托管资源),你仍然会得到相同的内存泄漏结果。 – frakon 2013-03-20 11:49:01
对此不太确定,但我想我记得C++/CLI有一个终结器和一个析构函数(事实上''DummyClass'为析构函数)。改为尝试。 – leppie 2013-03-20 12:06:08