试图获取一个文件名:
procedure TSomeClass.GetFileName(AData : string) : string;
var
p : pchar;
begin
p := pchar(AData);
while not (p^ in ['/', '&', '#', ':']) do
inc(p);
result := p;
end;
答案 0 :(得分: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;
复制代码的逻辑,并消除访问冲突的风险。但是,您的代码返回的字符串部分从/
,&
,#
或:
的第一个实例开始并包括在内。这真的是你想要的吗?