утечка памяти в getmem, delphi - PullRequest
2 голосов
/ 18 января 2010

Я пытаюсь запустить старый миди-компонент в Delphi, и он работает по большей части, но если я пытаюсь загрузить 2 файла подряд, он вылетает.

некоторые исследования привели меня кустановите EurekaLog, который указывает на утечки памяти в code.yay!

Я не очень хорошо разбираюсь с указателями памяти, но этот код, выделенный Эврикой, заставил меня задуматься, может быть, есть ошибка спамять не освобождается ??

Я пытался добавить FreeMem в конце, но это не работает?

function TMidifile.ReadString(F: integer): string;
var
  s: PChar;
  i: integer;
begin
  GetMem(s, F + 1);
  s[F] := chr(0);
  for i := 0 to F - 1 do
  begin
    s[i] := Chr(chunkIndex^);
    inc(chunkIndex);
  end;
  result := string(s);
end;

Ответы [ 3 ]

3 голосов
/ 18 января 2010

У Корнеля правильная идея. Возможно, вы могли бы упростить его еще больше, например, так:

function TMidifile.ReadString(F: integer): AnsiString; 
begin
  SetLength(Result, F);
  Move(ChunkIndex^, result[1], F);
  inc(chuncIndex, F);
end;

Это сделает чтение намного быстрее, особенно если вы используете версию Movecode для Fastcode (или последнюю версию Delphi, которая поставляется с версией Fastcode, встроенной в RTL.)

2 голосов
/ 18 января 2010

Вы не можете типизировать AnsiString, поскольку они подсчитаны.

Разве это не будет проще?

function TMidifile.ReadString(F: integer): string; 
var i: integer; 
begin
  SetLength(Result, F);  
  for i := 1 to F do 
  begin 
    Result[i] := Chr(chunkIndex^); 
    inc(chunkIndex); 
  end; 
end;
0 голосов
/ 18 января 2010

Проблема в том, что вы не можете взять кучу случайных байтов и разыграть ее как string. string имеет особую структуру, а распределение управляется компилятором.

Я мог бы переписать этот бит для вас, но я не думаю, что буду вам чем-то полезен, поскольку должен предположить, что код, вызывающий это, не работает лучше с точки зрения управления памятью. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...