2

我在下面有这个示例方法

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 对象),我想要 data 参数,首先释放它,但如果未分配(未创建对象),则 free 命令不会执行,但 free 语句始终执行,无论是否创建“数据”对象

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

4

2 回答 2

4

您的代码示例有一些问题

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

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


我相信您的实际问题来自这样一个事实,即本地的、未最终确定的变量没有被初始化为零/零。过程中的dataset变量Init包含变量指向的位置发生的任何垃圾。

在 Delphi 中初始化了哪些变量?

由于您没有初始化局部变量dataset (您应该始终对局部变量执行此操作)Assigned因此将返回 true (它所做的只是检查 nil)并被free调用。

大多数情况下,如果你幸运的话,对 free 的调用会抛出一个 AV。在最坏的情况下,它会成功,你将很难弄清楚为什么会出现问题。


编辑

我假设您的编辑是指ReadData在许多其他程序中调用它?

如果是这种情况,那么您确实无法(或就此而言)做很多事情来保护您免受来电者传递垃圾的影响。你应该做的是修复来电者。

解决根本原因,而不是症状

于 2013-05-02T05:37:55.760 回答
3

首先,您不必检查data对象的分配情况。指向Free时调用方法是完全安全的。datanil

至于您看不到data所指向的内容的原因:您可能需要关闭项目的优化。为此,请转到: Project > Options > Delphi Compiler > Compiling(这可能因您的 Delphi 版本而异)并将 Optimization 切换为False

于 2013-05-02T05:38:04.033 回答