delphi:var参数的不可访问值

时间:2013-05-02 05:22:14

标签: delphi parameters var

我在下面有这个示例方法

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;

如果我调试并在断点检查上放置断点,data.Free总是执行,我在监视列表上看到,数据始终无法访问值

我的观点是SomethingProcedure是许多其他程序的访问权限,我想要数据参数(如果已分配(已创建TDataset对象)),先将其释放,但如果未分配(未创建对象),则不执行自由命令,但是自由语句总是被执行,或者是“数据”对象是否已创建

如何检查已创建的对象

2 个答案:

答案 0 :(得分:4)

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

  • 您声明dataset但在data程序
  • 中通过Init
  • 您的if程序中then声明没有ReadData

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


我相信你的实际问题来自于本地的,未完成的变量未初始化为零/零。 dataset过程中的Init变量包含变量所指向的位置处的垃圾。

Which variables are initialized when in Delphi?

由于您没有初始化局部变量dataset (您应该总是使用局部变量)Assigned将返回true (它只是检查是否为并且free将被调用。

大部分时间如果你运气好的话,免费电话会抛出一个AV。最糟糕的情况是,它会成功,你将很难找出某些出错的原因。


修改

我认为你的编辑意味着在许多其他程序中调用了ReadData

如果是这种情况,那么(或者就此而言应该)确实没有太多可以保护您免受传入垃圾的调用者的攻击。 应该做的是修复来电者。

Fix the root cause, not the symptoms

答案 1 :(得分:3)

首先,您无需检查data对象以进行分配。 Free指向data时,可以非常安全地调用nil方法。

至于您无法看到data指向的内容的原因:您可能需要关闭项目的优化。要执行此操作,请转到:项目>选项> Delphi编译器>编译(这可能会因您的Delphi版本而异)并将优化切换为 False