use*_*858 6 delphi variables null pointers
我看了很多帖子在论坛上指点一下,Assigned
功能,Free
性能,FreeAndNil
功能等......我已经知道自由功能不去除指针引用到分配的对象,FreeAndNil
做它...所有的帖子我看了对待这个问题的考虑Create
方法已经被执行,或者换句话说,考虑已经创建的对象.
我的问题是:为什么Assigned
函数对于未初始化的对象变量返回true?
举个例子:
procedure TForm1.FormCreate(Sender: TObject);
var
Qry: TADOQuery;
begin
if Assigned(Qry) then
ShowMessage('Assigned')
else
ShowMessage('Unassigned');
Qry := TADOQuery.Create(nil);
if Assigned(Qry) then
ShowMessage('Assigned')
else
ShowMessage('Unassigned');
end;
Run Code Online (Sandbox Code Playgroud)
该示例显示"已分配"两次!
结论:在Qry
声明之后,在创建方法执行之前,指针Qry
就不是NIL
!
如果我把Qry := nil;
第一行放到上面的程序中,一切正常......它显示'未分配'和'已分配'.
为什么??
有没有什么安全的方法可以知道类变量是否已经执行了create方法?
因为在创建指针时,它带有该内存位置中的任何垃圾值。如果你想在里面写 NIL,它需要一些 CPU 周期,我认为 Delphi 不会自动完成,因为你可能想要更快的东西。在您的示例中,为什么将 NIL 分配给一个变量,如果不久之后您要在其中放入另一个值?
从Assigned
功能的文档(强调我的):
使用Assigned确定P引用的指针或过程是否为nil.P必须是指针或过程类型的变量引用.Assigned(P)对应于指针变量的测试P <> nil,对于程序变量对应于@P <> nil.
如果P为nil,则赋值返回false,否则返回true.
注意:Assigned无法检测到悬空指针 - 也就是说,不是nil但不再指向有效数据的指针.例如,在Assigned的代码示例中,Assigned将不会检测P无效的事实.
该Assigned
功能有效地实现为:
function Assigned(const P): Boolean;
begin
Result := Pointer(P) <> nil;
end;
Run Code Online (Sandbox Code Playgroud)
所以函数并没有真正检查值是否真的被赋值.相反,它正在检查被分配的副作用.
True
另一件需要注意的是,Assigned
无法确定其价值的有效性.例如,即使基础对象不再有效,也会Assigned
返回以下调用True
.
var
LObject: TObject;
begin
LObject := TObject.Create;
LObject.Free;
if Assigned(LObject) then ShowMessage('Still assigned!?');
end;
Run Code Online (Sandbox Code Playgroud)
编辑:附录
回答你问题的第二部分.
有没有什么安全的方法可以知道类变量是否已经执行了create方法?
没有安全的方法来确定是否已创建对象实例.(也没有办法可靠地确认它还没有被销毁.)
但是,您可以遵循一些惯例(和良好实践)来帮助您.
首先请注意,如果某些内容是创建的,那么您应该只是"不确定",如果它是该段代码的故意特征.例如,如果您打算将对象"延迟初始化".
Assigned
,因为你担心可能存在阻止它被分配的错误.所以现在我们(希望)同意你只检查是否创建了某些内容,如果你故意选择创建的是可选的.你这样做如下:
归档时间: |
|
查看次数: |
1092 次 |
最近记录: |