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でファイナライザーを実装するたびに発生するようです。
なぜこのメモリリークが発生するのですか?どうすればそれを回避し、ファイナライザーを他の(より複雑な)用途に使用できるでしょうか?
更新:原因は確かにコンソール/ stdoutまたはファイナライザーの他の非標準コードへの書き込みではありません。次のクラスは同じメモリリーク動作をします:
public ref class DummyClass
{
private:
double * ptr;
public:
DummyClass()
{
ptr = new double[5];
}
protected:
!DummyClass()
{
delete [] ptr;
}
}