it编程 > 编程语言 > Delphi

mORMot 1.18 第09章 AutoFree

190人参与 2024-05-12 Delphi

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)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

mORMot 1.18 第10章 连接表

05-12

mORMot 1.18 第08章 Delphi中的服务器端JavaScript

05-12

mORMot 1.18 第11章 JSON - JavaScript对象表示法

05-12

mORMot 1.18 第06章 概念

05-12

mORMot 1.18 第12章 Blobs(大二进制对象)

05-12

mORMot 1.18 第07章 简单的读写操作

05-12

猜你喜欢

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

发表评论