Как завершить строку threadvar, чтобы предотвратить утечку? - PullRequest
5 голосов
/ 28 марта 2011

Это не серьезная утечка, но мне кажется, что было бы неплохо привести ее в порядок, но я обнаружил, что мой код Delphi XE может пропускать строку . Это потому, что он определен как threadvar, каким он должен быть, но когда поток завершается, он, очевидно, не приводит в порядок такие переменные.

Есть ли способ вручную убрать строку по окончании потока? Должен ли я просто присвоить ему пустую строку или установить для него ноль или что-то еще?

Ответы [ 2 ]

5 голосов
/ 28 марта 2011

Присвойте ему пустую строку, присвойте ей значение nil или вызовите Finalize().Все они эквивалентны и освобождают хранилище, тем самым устраняя утечку памяти.


В ответ на комментарий Марко документация явно указана на этом:

Динамические переменные, которыми обычно управляет компилятор (длинные строки, широкие строки, динамические массивы, варианты и интерфейсы), могут быть объявлены с помощью threadvar, но компилятор не освобождает автоматически выделенную кучу память, созданную каждым потокомвыполнение.Если вы используете эти типы данных в переменных потока, вы обязаны распоряжаться их памятью внутри потока до его завершения.Например:

threadvar
  S: AnsiString;

S := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  ...
S := ;  // free the memory used by S

Довольно странно, документация содержит явную ошибку в последней строке, которая должна выглядеть следующим образом: S := nil;

Конечно, легко увидеть, что потоклокальные переменные не располагаются автоматически:

program LeakMe;

{$APPTYPE CONSOLE}

threadvar
  s: string;

begin
  ReportMemoryLeaksOnShutdown := True;
  s := 'Leak me';
end.
3 голосов
/ 06 января 2012

Другое небольшое решение - вы можете использовать здесь ShortString вместо String (или любой другой тип массива фиксированной длины), тогда утечка памяти исчезнет

...