Delphi XE、Windows 7 64 ビット
空のアプリケーションに言語サポートを追加すると、メモリ リーク (FastMM4) が発生します。
再現方法:
- 新しい VCL フォーム アプリケーションを作成する
- .dpr を変更して追加します
ReportMemoryLeaksOnShutdown := True;
- アプリケーションをビルド/実行し、アプリケーションを閉じます -> リークは報告されていません
- 言語を追加します (プロジェクト -> 言語 -> 追加)
- 再度ビルド/実行し、アプリケーションを閉じます -> メモリリーク??
FastMM4 フル デバッグ モード レポート:
--------------------------------2013/7/16 14:54:34--------------------------------
A memory block has been leaked. The size is: 12
This block was allocated by thread 0x17EC, and the stack trace (return addresses) at the time was:
40455E
40952D
4094C8
409834
409941
450058
74548D76 [Unknown function at FirstHookFunc]
7778FA1A [ZwOpenKey]
75924033 [OpenRegKey]
759240AE [OpenRegKey]
777FA71A [Unknown function at RtlUlonglongByteSwap]
The block is currently used for an object of class: Unknown
The allocation number is: 6
Current memory dump of 256 bytes starting at pointer address 7EF9A610:
6E 00 6C 00 2D 00 42 00 45 00 00 00 41 58 0D 7A 00 00 00 00 C1 A6 F9 7E 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 2E 00 00 00 5E 45 40 00 DD 99 40 00 6D 71 4B 00 98 65 40 00 04 66 40 00
77 A6 40 00 98 7C 4B 00 AA 33 8D 76 F2 9E 7A 77 C5 9E 7A 77 00 00 00 00 EC 17 00 00 EC 17 00 00
1F 9A 40 00 53 7F 42 00 2C 65 40 00 EA 68 40 00 E3 7C 4B 00 AA 33 8D 76 F2 9E 7A 77 C5 9E 7A 77
00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 B6 5C 27 4D 5C 12 4C 00 80 80 80 80
49 A3 D8 B2 80 80 80 80 00 00 00 00 F9 B7 F9 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
65 00 00 00 5E 45 40 00 A7 50 40 00 22 56 40 00 DC 50 40 00 5F 72 4B 00 78 96 44 00 8E 72 4B 00
98 65 40 00 04 66 40 00 77 A6 40 00 98 7C 4B 00 EC 17 00 00 EC 17 00 00 7A 45 40 00 C5 50 40 00
n . l . - . B . E . . . A X . z . . . . Á ¦ ù ~ . . . . . . . .
. . . . . . . . . . . . ^ E @ . Ý ™ @ . m q K . ˜ e @ . . f @ .
w ¦ @ . ˜ | K . ª 3 v ò ž z w Å ž z w . . . . ì . . . ì . . .
. š @ . S B . , e @ . ê h @ . ã | K . ª 3 v ò ž z w Å ž z w
. . . . . . . . . . . . . . . . . . . . ¶ \ ' M \ . L . € € € €
I £ Ø ² € € € € . . . . ù · ù ~ . . . . . . . . . . . . . . . .
e . . . ^ E @ . § P @ . " V @ . Ü P @ . _ r K . x – D . Ž r K .
˜ e @ . . f @ . w ¦ @ . ˜ | K . ì . . . ì . . . z E @ . Å P @ .
--------------------------------2013/7/16 14:54:34--------------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):
5 - 12 bytes: Unknown x 1
Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine "EnableMemoryLeakReporting".
面白いことに、言語を削除して再度実行します -> リークはそのままです!
.dpr ファイルと .res ファイルを除くすべてのプロジェクト関連ファイル (.dproj、.dproj2007、.dsk など) を削除することで、リークを取り除くことができます。
誰かが私に何が起こっているのか説明できますか?
アップデート
詳細ログのアドレスを使用すると、System.Pas でリークが見つかったようです。
var
PreferredLanguagesOverride: PChar = nil;
...
procedure SetLocaleOverride(const NewPreferredLanguages: string);
var
L: Integer;
begin
if PreferredLanguagesOverride <> nil then
FreeMem(PreferredLanguagesOverride);
L := Length(NewPreferredLanguages);
if L > 0 then
begin
Inc(L);
GetMem(PreferredLanguagesOverride, L * SizeOf(Char));
MoveChars(NewPreferredLanguages[1], PreferredLanguagesOverride^, L);
end;
end;
SetLocaleOverride が呼び出され、PreferredLanguagesOverride
PChar
. System.Pas をスキャンしましたFreeMem(PreferredLanguagesOverride)
が、これが唯一の発生です。
更新2
Delphiがルーチンを呼び出す理由を見つけましたSetLocaleOverride
:
言語サポートを追加すると、レジストリ キーが作成され、実行可能なフル パスとして名前が付けられ、現在のシステム ロケールが値として次のように指定されます: HKEY_CURRENT_USER\Software\Embarcadero\Locales
このキーを削除すると、delphi がSetLocaleOverride
ルーチンを呼び出せなくなります。
質問:
- この問題が新しいバージョンの Delphi に存在するかどうかを誰かが確認できますか? (または、QC レポートを作成します)
更新 3
すでにQC レポート (105136)があり、XE3 から修正されています。
質問: これが XE3 でどのようにパッチされているか教えてもらえますか?