190人参与 • 2024-05-12 • Delphi
如果你忘记释放一个 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日
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论