ファイナライザとデストラクタが実装された「CTransferManaged」という名前の C++/CLI クラスがあります。
CTransferManaged::~CTransferManaged()
{
this->!CTransferManaged();
}
CTransferManaged::!CTransferManaged()
{
//Clean up resources...
}
このクラスは、タイプ CTransferManaged のオブジェクト m_transfer を含む「CTransfer」という名前の C# クラスでラップされます。
このクラスのデストラクタがオブジェクト m_transfer への参照のみをクリアする場合、デストラクタが呼び出される (ブレークポイントがヒットする) ことがわかります。
~CTransfer()
{
m_transfer = null; //breakpoint on this line
}
他に何も変更せずに m_transfer オブジェクトの Dispose() 関数を呼び出すと、デストラクタは呼び出されなくなります (ブレークポイントはヒットしなくなります)。なぜだと思いますか?
~CTransfer()
{
m_transfer.Dispose(); //breakpoint on this line
m_transfer = null;
}
Dispose() を手動で呼び出さないと、C++/CLI オブジェクト (m_transfer) のリソースが適切にクリーンアップされないことがわかったので、手動で Dispose() を呼び出したいと思います。現時点では、正確な理由はわかりません。
CTransferManaged::Dispose() (C++/CLI) を呼び出すとすぐに、CTransfer (C# クラス) のデストラクタが呼び出されなくなったのはなぜですか?