gpt4 book ai didi

delphi:var 参数上的不可访问值

转载 作者:行者123 更新时间:2023-12-03 18:16:29 24 4
gpt4 key购买 nike

我在下面有这个示例方法

procedure ReadData(var data:TDataSet)
begin
if Assigned(data) then
data.Free;
data:=TDataSet.Create(nil);
....
end;

.....
procedure SomethingProcedure()
var
dataSet:TDataset;
begin
ReadData(dataSet);
end;

如果我调试并在 Assigned 检查上放置断点,data.Free 总是执行,而且我在监视列表中看到,data 总是不可访问的值

我的观点是 SomethingProcedure 是许多其他过程的访问权限,如果它已分配(已创建 TDataset 对象),我想要数据参数,首先释放它,但如果未分配(未创建对象),则释放命令不会执行,但 free 语句始终执行,无论是否创建“数据”对象

如何检查我的对象是否已经创建

最佳答案

您的代码示例存在一些问题

  • 您声明了数据集,但在您的Init 过程中传递了数据
  • if 语句在您的ReadData 过程中没有then

总而言之,您不可能一直在调试您给出的示例,所以我将在这里做出一些假设。


我相信您的实际问题是因为局部的、未最终确定的变量没有被初始化为零/零。 Init 过程中的 dataset 变量包含恰好位于变量指向的位置的任何垃圾。

Which variables are initialized when in Delphi?

由于您没有初始化局部变量 dataset (您应该始终对局部变量做的事情)Assigned 将返回 true < em>(它所做的只是检查 nil) 并且 free 将被调用。

大多数时候,如果幸运的话,调用 free 会抛出 AV。最坏的情况是,它会成功,您将很难弄清楚为什么某事出了问题。


编辑

根据您的编辑,我假设您的意思是 ReadData 在许多其他过程中被调用?

如果是这样的话,您真的没有什么可以(或者就此而言应该)来保护您免受调用者传递垃圾信息的影响。您应该做的是修复调用者。

Fix the root cause, not the symptoms

关于delphi:var 参数上的不可访问值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16330846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com