Все ли объекты C ++ / CLI требуют удаления? - PullRequest
0 голосов
/ 16 января 2019

Насколько я понимаю ( частично из чтения потоков здесь ), каждый объект C ++ / CLI в мире автоматически реализует IDisposable благодаря своему деструктору C ++ / CLI.

Мое дальнейшее понимание заключается в том, что всякий раз, когда ваш управляемый класс A использует экземпляр другого управляемого класса B, который реализует IDisposable, он несет ответственность за реализацию IDisposable где-то (или использование " используя «заявление», чтобы гарантировать, что B.Dispose вызывается.

Они оба верны? Если это так, то это означает, что в основном, когда бы я ни использовал объект C ++ / CLI в любом месте моего кода C #, мне нужна реализация IDisposable или использование для его очистки. Да

этого я не осознавал

В моем текущем проекте приложения ни один из моих классов C # на самом деле не "владеет" ни одним из экземпляров объекта C ++ / CLI, которые они используют. Я имею тенденцию создавать и передавать их свободно. Объект C # класса «A» может создать объект C ++ / CLI и затем передать его экземплярам классов C # «B» и «Z». Все 3 могут хранить ссылки на него, поэтому ни один из них не может вызвать Dispose, потому что ни один из них не владеет им.

Так что у меня есть целая куча IDisposable объектов C ++ / CLI, и никто никогда не вызывает Dispose для них.

Я думал, что это нормально. Лишь немногие из моих классов C ++ / CLI выделяют значительную часть памяти.

Это то, что меня должно волновать? Должен ли я попытаться перестроить свое приложение так, чтобы каждый объект C ++ / CLI принадлежал одному и только одному объекту C #, чтобы я мог реализовать IDisposable в классах C # и покорно вызывать Dispose для базовых экземпляров C ++ / CLI?

1 Ответ

0 голосов
/ 17 января 2019

Короткий ответ: «Нет», все классы CLI не требуют утилизации. Утилизация необходима только тогда, когда в игру вступают неуправляемые ресурсы. Например, дескриптор файла или память, которая была выделена в неуправляемой куче.

Редактировать ...

Я не верю, что «каждый класс C ++ / CLI в мире реализует IDisposable по замыслу» - это верное утверждение. Было бы правильно сказать, что «каждый класс C ++ / CLI , который объявляет финализатор , реализует IDisposable». Когда в C ++ вы delete управляете объектом, вызывается его деструктор, который, в свою очередь, должен вызывать свой собственный финализатор. Когда в C # (например) вы вызываете Dispose() (либо явно, либо через блок using), вызывается его финализатор, что фактически означает, что он реализует IDisposable. Если финализатор отсутствует, объект не может быть корректно удален с языка, такого как C #.

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/ms177197(v=vs.100)

...