Ho una classe C++/CLI denominato "CTransferManaged" con finalizzatore e distruttore implementato:C#/CLI: Destructor non chiamato se Dispose() utilizzato in esso
CTransferManaged::~CTransferManaged()
{
this->!CTransferManaged();
}
CTransferManaged::!CTransferManaged()
{
//Clean up resources...
}
Questa classe è avvolto con una classe C# denominata "CTransfer" contiene un oggetto m_transfer di tipo CTransferManaged.
Se il distruttore di questa classe cancella solo il riferimento all'oggetto m_transfer posso vedere che il distruttore è chiamato (punto di interruzione viene colpito):
~CTransfer()
{
m_transfer = null; //breakpoint on this line
}
Se io chiamo la funzione Dispose() del m_transfer oggetto senza cambiare altro, il distruttore non viene più chiamato (punto di interruzione non più colpito). Qualche ipotesi perch?
~CTransfer()
{
m_transfer.Dispose(); //breakpoint on this line
m_transfer = null;
}
vorrei chiamare Dispose() manualmente da quando ho scoperto che le risorse dell'oggetto C++/CLI (m_transfer) non sono puliti correttamente se non chiamare Dispose manualmente. Al momento non so esattamente perché.
Perché il distruttore di CTransfer (classe C#) non viene più chiamato non appena chiama CTransferManaged :: Dispose() (C++/CLI)?
tuo CTransfer classe * deve * implementare IDisposable in modo che possa smaltire correttamente il membro m_transfer. Sembra che tu l'abbia fatto. ** Non ** implementare un finalizzatore per CTransfer. Impostare un membro su null non ha alcun effetto utile e chiamare il suo metodo Dispose() è semplicemente sbagliato. –
@HansPassant: Perché è errato chiamare il metodo Dispose() di un oggetto membro (m_transfer) all'interno del finalizzatore di CTransfer? Come ho detto, ho scoperto che le risorse di m_transfer non vengono pulite correttamente quando non chiamo Dispose() su di esso (
obruend