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