当前位置: 代码网 > it编程>编程语言>Delphi > mORMot 1.18 第09章 AutoFree

mORMot 1.18 第09章 AutoFree

2024年05月12日 Delphi 我要评论
mORMot 1.18 第9章 AutoFree 如果你忘记释放一个 TSQLQuery对象会发生什么?会丢失一小部分内存。 如果这种情况在服务器上反复发生,你最终会耗尽内存,导致服务停止。 有一个极好的选项可以保证你通过创建一个 AutoFree变量来自动释放内存。在Delphi中(不是在Free ...

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);

注意:本文由hieroly翻译于2024年04月26日

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com