Это приведет к утечке памяти в Delphi? - PullRequest
1 голос
/ 04 августа 2011

В попытке получить только имя файла:

procedure TSomeClass.GetFileName(AData : string) : string;
var
  p : pchar;
begin

  p := pchar(AData);
  while not (p^ in ['/', '&', '#', ':']) do
    inc(p);

  result := p;

end;

1 Ответ

10 голосов
/ 04 августа 2011

Там нет утечки памяти.Ваш указатель p указывает на блок памяти, который принадлежит строке AData, поэтому вам не нужно освобождать p.Строковый класс управляет всем выделением и освобождением за вас.

Однако может произойти следующее: если строка не содержит хотя бы одного из этих 4 символов, ваш цикл завершится и в конечном итоге вызовет нарушение прав доступа.Вы должны рассмотреть возможность завершения цикла, когда он достигнет нулевого терминатора.

Проще вообще избегать указателей:

function TSomeClass.GetFileName(const AData: string): string;
var
  i, len: Integer;
begin
  len := Length(AData);
  for i := 1 to len do
    if AData[i] in ['/', '&', '#', ':'] then begin
      Result := Copy(AData, i, len);
      exit;
    end;
  Result := '';
end;

Реплицирует логику вашего кода и устраняет риск доступанарушения.Однако ваш код возвращал часть строки, начиная с первого экземпляра /, &, # или :.Вы действительно этого хотели?

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