正确的CryptoAPITransform使用?内存泄漏

时间:2012-03-19 19:20:04

标签: c# .net windows vb.net cryptography

我已经移植了一段旧的非托管代码,它使用Crypto API来实现100%托管的.NET代码。代码使用DES算法,并且由于几个原因不得不维护它。

由于从CreateDecryptor和CreateEncryptor方法获得的CryptoAPITransform个实例被标记为可重用,我只想创建它们的实例并在需要时使用它们。

似乎代码工作正常,但它导致内存泄漏,因此决定每次都创建和处理一个实例。到目前为止它似乎没有泄漏,但我想知道我以前是否使用过它,如果是的话,我是否可以重用这些实例。

该应用程序是多线程的,并且同时进行大量操作,因此可能存在线程问题,尽管我无法找到任何异常或损坏的消息。此外,我的所有操作都是通过致电TransformFinalBlock来完成的。这听起来对你好吗?测试应用程序是繁琐的,但我想我会尝试自己,如果同步线程阻止任何机会泄漏。

1 个答案:

答案 0 :(得分:2)

这很可能是与线程相关的错误。来自the documentation on CryptoAPITransform

  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全

我不能强调查看线程中共享实例的所有类的“线程安全”文档是多么重要。

我的猜测是,在这种情况下,类的实现依赖于一些状态来正确使用/处置非托管代码,并且通过在多个线程中使用它们导致无法正确处置它们。

所有这些都是当然的猜测。我不知道这个类是如何在内部实现的。