这会导致Delphi内存泄漏吗?

MX4*_*399 1 delphi pointers

试图获取一个文件名:

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

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

  result := p;

end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 10

那里没有内存泄漏.您的指针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;
Run Code Online (Sandbox Code Playgroud)

复制代码的逻辑,并消除访问冲突的风险.然而,你的代码是从返回开始字符串的一部分,并包括,第一个实例/,&,#:.这真的是你想要的吗?

  • 您可能会感到惊讶,但是对于空字符串,您将没有访问冲突."P:= PChar(S)"和"P:=指针(S)"之间存在差异.只有在第二种情况下,你得到AV为空`S`,在第一种情况下,你得到一个有效指针`#0`字符 (4认同)
  • 因此在集合中添加#0可以解决溢出问题? (2认同)