Различные источники, похоже, препятствуют типизированным константам в пользу более объектно-ориентированных методов. Например, DelphiBasics, где они описываются как «очень странные» и StackOverflow Question, в которых дается некоторое представление о том, почему они могут использоваться. Вот пример истинной и типизированной константы.Может ли типизированные константы быть источником утечек памяти?
const
RESULTS_BASIC1 = $01; // True constant
RESULTS_BASIC2: BYTE = $01; // Typed constant
Я использую Delphi 7 и FastMM4 и утечка одного TCriticalSection в отчетах. После включения подробного файла карты в опциях проекта, трассировки стека FastMM4 показывает что-то вроде этого:
402E58 [StConst][StConst][@GetMem]
40454B [WinConvert][WinConvert][d_len]
404926 [Main][Main][EXAMPLE_TYPED_CONSTANT1]
...
Если я затем удалить типизированной константой, то же TCriticalSection сообщается как утечку ... на следующей машинке постоянная! После замедления удаления одной типизированной константы за другой я все еще не приближаюсь к «истинному» источнику утечки.
Две смежные вопросы:
1) Может ли наберется константа (которые на самом деле являются переменными с адресом памяти) является истинным источником утечки памяти? Может ли FastMM4 сообщать об утечке по ошибке?
2) Следует ли исключать типизированные константы, и если да, то в чем рекомендуемая альтернатива? Например, скажем, я использую истекшее процессор TickCount (беззнаковое 32-битное целое число):
dwElapsed := (GetTickCount() - m_dwLastFlashCheck);
if (dwElapsed > 2000) then
begin
m_dwLastFlashCheck := GetTickCount();
DoSomething();
end;
кажется естественным, чтобы определить «константа», как в:
RATE_FLASH: DWORD = 2000;
// ...
if (dwElapsed > RATE_FLASH) then
// etc
Связанный, [утечка строки delphi] (http://stackoverflow.com/q/5423329/576719). –
В последнем вопросе использование типизированной константы не требуется. Достаточная константа, RATE_FLASH = 2000'. Компилятор обычно найдет правильный перевод. В некоторых случаях вы можете использовать 'RATE_FLASH = DWORD (2000)', чтобы сделать его более понятным. –
@ LURD: Правильно! В будущем я буду использовать ваш предложенный «RATE_FLASH = DWORD (2000)», поскольку это кажется ясным и дает истинную константу. – AlainD