10 SeattleのdbExpressでTWideStringFieldを持つテーブルを開くと、メモリリークが発生する

提供: Support
移動先: 案内検索

問題

TSQLConnectionParamsプロパティで、ServerCharSet=UTF8を設定し、データベースへ接続すると、参照しているテーブルのVARCHAR等の文字列型のカラムは、Delphi/C++Builderでは、TWideStringFieldへマッピングされます。

そしてTWideStringFieldのカラムを持つテーブルを開き、アプリケーションを終了すると、以下の図のようにFastMMによってメモリリークが検出されます。

memory_leak

解決

本件は、適切な条件でメモリを解放していないdbExpressの不具合であり、10.1 Berlinで修正済みです。

なお、10 Seattleで本件を解決するためには、Data.DBXPlatformユニット内のTDBXPlatform.FreeAndNilWideStringBuilderメソッドを以下のように修正してください。


(修正前)

src_before

(修正後)

src_after


今回修正が必要なユニットファイルは、Data.DBXPlatform.pasのみですが、 Data.DBXPlatformがData.SqlExpr、Data.DBXDBReaders、Data.DBXCommonのユニットに依存しているため

  • Data.SqlExpr.pas
  • Data.DBXDBReaders.pas
  • Data.DBXCommon.pas

も併せて自身のプロジェクトへコピーし、一緒にビルドする必要があります。