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

时间:2018-01-20 14:31:04

标签: delphi encoding base64

以下是TNetEncoding.GetBase64Encoding的原始Delphi源代码。但我怀疑在AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil

的情况下会出现内存泄漏
 TNetEncoding = class
  private
    class var
      FBase64Encoding: TNetEncoding;

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;

我认为必须写成:

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;

我错了吗?

1 个答案:

答案 0 :(得分:8)

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

您应该提交错误报告。