delphi - ARC : is there a memory leak in TNetEncoding. 获取Base64Encoding?

标签 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;

我错了吗?

最佳答案

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

您应该提交错误报告。

关于delphi - ARC : is there a memory leak in TNetEncoding. 获取Base64Encoding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48357312/

相关文章:

c - 二进制数组转base64

html - 如何使用 Pandoc 将带有数字的 DOCX 文件转换为使用 base64 的独立 HTML 文件?

delphi - 语言问题 : record field with an anonymous record(? ) 作为类型...?

php - mb_strlen() 和 strlen() 不会从对 PHP 的 Ajax 调用返回正确的值

ruby - 用逗号、双引号和编码解析 csv

unicode - 将普通空格/空格转换为不间断空格?

image - Delphi组合阵列图像

delphi - 如何从使用 TFileOpenDialog 中回收内存?

delphi - 使用 ComboBox 在 TImage 中加载 ImageList 图片

ios - Base64 图像编码 Swift 4 iOS