У меня есть класс C++/CLI под названием «CTransferManaged» с реализованной финализацией и деструктором:C#/CLI: Деструктор не вызывается, если Dispose(), используемым в ней
CTransferManaged::~CTransferManaged()
{
this->!CTransferManaged();
}
CTransferManaged::!CTransferManaged()
{
//Clean up resources...
}
Этого класс обернут с C# класса по имени «CTransfer» содержит объект m_transfer типа CTransferManaged.
Если деструктор этого класса удаляет только ссылку на объект m_transfer я могу видеть, что деструктор (точка останова):
~CTransfer()
{
m_transfer = null; //breakpoint on this line
}
Если я вызываю функцию Dispose() в m_transfer объект без изменения чего-либо еще, деструктор больше не вызывается (точка останова больше не попадает). Какие-нибудь догадки почему?
~CTransfer()
{
m_transfer.Dispose(); //breakpoint on this line
m_transfer = null;
}
Я хотел бы назвать Dispose() вручную, так как я узнал, что ресурсы объекта C++/CLI (m_transfer) не очищены должным образом, если я не называю Dispose вручную. На данный момент я точно не знаю, почему.
Почему деструктор CTransfer (класс C#) больше не вызван, как только он вызывает CTransferManaged :: Dispose() (C++/CLI)?
Ваш класс CTransfer * должен * реализовать IDisposable, чтобы он мог правильно распоряжаться членом m_transfer. Похоже, ты это сделал. Do ** not ** реализовать финализатор для CTransfer. Установка члена в null не имеет никакого полезного эффекта, и вызов метода Dispose() просто неверен. –
@HansPassant: Почему неправильный вызов метода Dispose() объекта-члена (m_transfer) в финализаторе CTransfer? Как я уже упоминал, я выяснил, что ресурсы m_transfer не очищаются должным образом, когда я не вызываю Dispose() на нем (
obruend