mORMot 1.18 第09章 AutoFree
  ZGYAxb2wjd2Z 18天前 22 0

mORMot 1.18 第9章 AutoFree

如果你忘记释放一个 TSQLQuery对象会发生什么?会丢失一小部分内存。

如果这种情况在服务器上反复发生,你最终会耗尽内存,导致服务停止。

有一个极好的选项可以保证你通过创建一个 AutoFree变量来自动释放内存。在Delphi中(不是在FreePascal中),你可以使用这种简单的表示法。

替换

ababy := TSQLBaby.Create
\\ 替换为
TSQLBaby.AutoFree( ababy );

当变量超出范围时,它将自动被释放。

function NewMaleBaby(Client: TSQLRest; const Name, Address: RawUTF8): TID;
var
  Baby: TSQLBaby; // 存储一个记录
begin
  TSQLBaby.AutoFree(Baby); // 不需要try..finally!
  Baby.Name := Name;
  Baby.Address := Address;
  Baby.BirthDate := Date;
  Baby.Sex := sMale;
  result := Client.Add(Baby, true);
end; // 本地的Baby实例将在此处被释放

同样地,你可以自动释放查询:

替换

Ababy := TSQLBaby.CreateAndFillPrepare(db, 'name like ?', ['A*']);
替换为
TAutoFree.Create(Ababy, TSQLBaby.CreateAndFillPrepare(db, 'name like ?', ['A*']));

所以一个查询可以简单到如下:

var
  aMale: TSQLBaby;
...
  TAutoFree.Create(aMale, TSQLBaby.CreateAndFillPrepare(Client, 'Name LIKE ? AND Sex = ?', ['A%', ord(sMale)]));
  while aMale.FillOne do
    DoSomethingWith(aMale);

这里不需要try/finally块。

如果你希望代码同时兼容Delphi和FPC,你可以使用稍微复杂一点的 IAutoFree

var
  aMale: TSQLBaby;
...
  auto: IAutoFree;
...
  auto := TAutoFree.Create(aMale,
  TSQLBaby.CreateAndFillPrepare(Client, 'Name LIKE ? AND Sex = ?', ['A%', ord(sMale)]));
  while aMale.FillOne do
    DoSomethingWith(aMale);
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 18天前 0

暂无评论

推荐阅读
  trFW46kwzceA   2024年01月13日   16   0   0 Delphi
  trFW46kwzceA   2024年01月11日   19   0   0 Delphi
  jl63rPptnaFE   2024年02月21日   16   0   0 Delphi
  trFW46kwzceA   2024年01月10日   19   0   0 Delphi
ZGYAxb2wjd2Z