2012-03-19 3 views
2

私は、Crypto APIを使用して管理されていない古いコードを100%管理された.NETコードに移植しました。コードはDESアルゴリズムを使用しており、いくつかの理由でそれを維持しなければなりませんでした。CryptoAPITransformを正しく使用していますか?メモリリーク

CreateDecryptorおよびCreateEncryptorメソッドから取得したインスタンスが再利用可能とマークされているため、私はそれらのインスタンスを作成し、必要なときに使用することを考えました。

コードが正常に機能しているようですが、メモリリークの原因となりましたので、毎回インスタンスを作成して処分することにしました。これまで漏れていないようですが、前に間違って使用していたかどうかを知りたい場合は、インスタンスを再利用できるかどうかを知りたいと思います。

アプリはマルチスレッドであり、同時に多くの操作を行うため、例外や破損したメッセージを見つけることはできませんでしたが、スレッドの問題が発生する可能性があります。また、すべて私の操作はTransformFinalBlockと呼んで行った。これはあなたに正しいと思いますか?アプリをテストするのは面倒ですが、スレッドを同期させると万が一漏れが止まったら自分で試してみます。

答えて

2

おそらくスレッド関連のバグでした。 the documentation on CryptoAPITransformから:

(Visual BasicではShared)この型のpublic staticメンバーは、安全 スレッドです。どのインスタンスメンバーもスレッド が安全であるとは保証されません。

スレッド間で共有しているインスタンスを持つすべてのクラスの「スレッドセーフティ」のドキュメントを調べることがどれほど重要であるかはわかりません。

私の推測では、この場合、クラスの実装は、アンマネージコードを正しく使用/処分するためにいくつかの状態に依存しており、それらを複数のスレッドで使用することによってこれらを適切に処分できませんでした。

これはすべて当然のことです。私はこのクラスが内部的にどのように実装されているのかわかりません。

+0

私は昨日あなたの答えの前にスレッドシナリオをテストして、メモリリークの根本的な原因であることを確認できました。とにかく、今のところ、さらにテストをせずに、私は毎回新しいインスタンスを作成することにしました。コールの同期化がより高価な極端な状況がありますが、それがより良いところもあります。また、私はここに来る前にMSDNのエントリー方法を読んでいましたが、これらの年の後、私はその種の情報をあまり信頼しておらず、他の開発者からの意見を聞きたいと思っています。 – Neverbirth

+0

ああ、あなたは私を信用する前にMSDNドキュメント*ロング*を信用しなければなりません:-) –

関連する問題