我在下面有这个示例方法
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对象)),先将其释放,但如果未分配(未创建对象),则不执行自由命令,但是自由语句总是被执行,或者是“数据”对象是否已创建
如何检查已创建的对象
答案 0 :(得分:4)
您的代码示例存在一些问题
dataset
但在data
程序Init
if
程序中then
声明没有ReadData
总而言之,你不可能一直在调试你给出的例子,所以我将在这里做一些假设。
我相信你的实际问题来自于本地的,未完成的变量未初始化为零/零。 dataset
过程中的Init
变量包含变量所指向的位置处的垃圾。
Which variables are initialized when in Delphi?
由于您没有初始化局部变量dataset
(您应该总是使用局部变量),Assigned
将返回true (它只是检查是否为并且free
将被调用。
大部分时间如果你运气好的话,免费电话会抛出一个AV。最糟糕的情况是,它会成功,你将很难找出某些出错的原因。
修改强>
我认为你的编辑意味着在许多其他程序中调用了ReadData
?
如果是这种情况,那么(或者就此而言应该)确实没有太多可以保护您免受传入垃圾的调用者的攻击。 应该做的是修复来电者。
答案 1 :(得分:3)
首先,您无需检查data
对象以进行分配。 Free
指向data
时,可以非常安全地调用nil
方法。
至于您无法看到data
指向的内容的原因:您可能需要关闭项目的优化。要执行此操作,请转到:项目>选项> Delphi编译器>编译(这可能会因您的Delphi版本而异)并将优化切换为 False 。