Правильно ли использовать CryptoAPITransform?Утечка памяти - PullRequest
2 голосов
/ 19 марта 2012

Я портировал старый фрагмент неуправляемого кода, который использовал Crypto API, на 100% управляемый код .NET.Код использовал алгоритм DES и должен был поддерживать его по нескольким причинам.

Поскольку экземпляры CryptoAPITransform, полученные из методов CreateDecryptor и CreateEncryptor, помечены как повторно используемые, я подумал о создании их экземпляра и использованииих всякий раз, когда это необходимо.

Кажется, код работал, но он вызывал утечки памяти, поэтому решил каждый раз создавать и удалять экземпляр.Пока, похоже, он не протекает, но я хотел бы знать, использовал ли я его раньше неправильно, и если да, могу ли я повторно использовать экземпляры.

Приложение является многопоточным, ивыполняет много операций одновременно, поэтому могут возникнуть проблемы с многопоточностью, хотя я не смог найти исключение или поврежденное сообщение.Кроме того, все мои операции были сделаны с помощью вызова TransformFinalBlock.Это звучит правильно для вас?Тестирование приложения утомительно, но я думаю, что попробую сам, если синхронизация потоков остановит утечку случайно.

1 Ответ

2 голосов
/ 20 марта 2012

Скорее всего, это была ошибка, связанная с потоками. С документация по CryptoAPITransform :

Любые открытые статические (Shared в Visual Basic) члены этого типа Поток безопасно. Любые члены экземпляра не гарантированно являются потоками сейф.

Я не могу не подчеркнуть, насколько важно просмотреть документацию "Thread Safety" для всех классов, экземпляры которых вы разделяете между потоками.

Я предполагаю, что в этом случае реализация класса полагается на какое-то состояние для правильного использования / удаления неуправляемого кода, и, используя их в нескольких потоках, вы вызывали сбой при их правильной утилизации.

Все это, конечно, предположение. Я не знаю, как этот класс реализован внутри.

...