Ich habe eine C++/CLI-Klasse namens "CTransferManaged" mit implementierter Finalizerthread und destructor:C#/CLI: Destructor nicht aufgerufen, wenn Dispose(), die in es
CTransferManaged::~CTransferManaged()
{
this->!CTransferManaged();
}
CTransferManaged::!CTransferManaged()
{
//Clean up resources...
}
Diese Klasse mit einer C# Klasse mit dem Namen gewickelt "CTransfer" enthält ein Objekt m_transfer vom Typ CTransManaged.
Wenn der Destruktor dieser Klasse löscht nur die Referenz auf das Objekt m_transfer ich sehen kann, dass der Destruktor aufgerufen wird (Haltepunkt getroffen wird):
~CTransfer()
{
m_transfer = null; //breakpoint on this line
}
Wenn ich rufen Sie die Dispose() Funktion des m_transfer Objekt, ohne etwas anderes zu ändern, wird der Destruktor nicht mehr aufgerufen (Haltepunkt kein Treffer mehr). Irgendwelche Vermutungen warum?
~CTransfer()
{
m_transfer.Dispose(); //breakpoint on this line
m_transfer = null;
}
Ich möchte Dispose() aufrufen, manuell, da ich, dass die Ressourcen des C herausgefunden ++/CLI-Objekt (m_transfer) nicht richtig gereinigt, wenn ich nicht manuell entsorgen nennst. Im Moment weiß ich nicht genau warum.
Warum wird der Destruktor von CTransfer (C# -Klasse) nicht mehr aufgerufen, sobald er CTransferManaged :: Dispose() (C++/CLI) aufruft?
Ihre CTransfer-Klasse * muss IDisposable implementieren, damit sie das m_transfer-Mitglied ordnungsgemäß entsorgen kann. Sieht so aus, als hättest du das getan. Setzen Sie ** nicht ** einen Finalizer für CTtransfer ein. Das Festlegen eines Members auf null hat keinen nützlichen Effekt und der Aufruf der Dispose() -Methode ist einfach falsch. –
@HansPassant: Warum ist es falsch, die Dispose() - Methode eines Mitgliedsobjekts (m_transfer) im Finalizer von CTransfer aufzurufen? Wie ich bereits erwähnt habe, habe ich herausgefunden, dass die Ressourcen von m_transfer nicht richtig aufgeräumt werden, wenn ich Dispose() nicht darauf anrufe (
obruend