ARC:TNetEncoding.GetBase64Encoding中是否存在内存泄漏?

lok*_*oki 9 delphi base64 encoding

下面是原始的Delphi源代码TNetEncoding.GetBase64Encoding.但我怀疑是否会出现内存泄漏AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil

 TNetEncoding = class
  private
    class var
      FBase64Encoding: TNetEncoding;
Run Code Online (Sandbox Code Playgroud)

class function TNetEncoding.GetBase64Encoding: TNetEncoding;
var
  LEncoding: TBase64Encoding;
begin
  if FBase64Encoding = nil then
  begin
    LEncoding := TBase64Encoding.Create;
    if AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil then
      LEncoding.Free;
{$IFDEF AUTOREFCOUNT}
    FBase64Encoding.__ObjAddRef;
{$ENDIF AUTOREFCOUNT}
  end;
  Result := FBase64Encoding;
end;
Run Code Online (Sandbox Code Playgroud)

我认为必须写成:

class function TNetEncoding.GetBase64Encoding: TNetEncoding;
var
  LEncoding: TBase64Encoding;
begin
  if FBase64Encoding = nil then
  begin
    LEncoding := TBase64Encoding.Create;
    if AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil then
      LEncoding.Free
{$IFDEF AUTOREFCOUNT}
    !!!ELSE!!! FBase64Encoding.__ObjAddRef;
{$ENDIF AUTOREFCOUNT}
  end;
  Result := FBase64Encoding;
end;
Run Code Online (Sandbox Code Playgroud)

我错了吗?

Dav*_*nan 8

你是对的.当if语句的计算结果为true时,代码将失败.当发生这种情况时,另一个线程已经设法首先分配单例,并且已经增加了引用计数.不应再次增加引用计数.

您应该提交错误报告.