cvmachine.com - 申博开户网

查找: 您的方位主页 > 网络频道 > 阅览资讯:判别Delphi中的目标指针是否可用的办法

判别Delphi中的目标指针是否可用的办法

2016-09-07 06:27:49 来历:www.cvmachine.com 【

判别Delphi中的目标指针是否可用的办法

Musicwind于2004年6月郑重声明:以下内容纯属胡说八道,荒唐之至!相关内容于csdn程序员杂志某期增刊宣布,实属误人子弟之不幸!在此向广大读者致谦!

探求:怎样判别Delphi中的目标指针是否可用

作者: Musicwind?

创立时刻:2001-08-07


近来,在网上看到有网友问曰:怎样确认一个目标指针是否可用?也便是说,怎样确认一个目标指针是否指向一个实在可用的目标实例?其实这本不应该成为一个问题。由于关于程序设计者来说,他应该可以操控自己的程序不去拜访一个无效的指针,由于一切的目标实例的创立和毁掉都在他操控之下。而且即便没有一个直接的办法来判别目标指针是否可用,也可以经过其他直接的途径(比方运用一些标识等)来做到这一点(比方当咱们毁掉一个目标实例后,咱们将目标指针的指置为nil)。可是假定咱们抛开以上所说的这两点不谈,单单来研讨在Delphi中,终究有没有办法来判别一个目标指针是否可用,那状况会怎样呢?

Object Pascal中,一个类可以有两种类型的办法,一种称为目标办法(Object Method),另一种是类办法(Class Method)。所谓目标办法,指的是办法的界说是针对目标(或称实例)的,因而调用该办法需求根据某个目标(或称实例),比方类的析构函数Destroy便是一个目标办法(其实咱们常常用到的绝大部分办法都是目标办法)。而类办法,指的是办法的界说是根据一类目标而言,因而调用该办法不需求根据特定的目标实例,比方类的结构函数Create便是如此。这一点,对咱们有些启示。判别一个目标指针是否可用,好像可以经过以下过程来完结。首要,咱们可以判别该目标指针是否是nil,假如是,那么功德圆满,确认不可用无疑;假如否,那么测验履行该目标的某个目标办法,看看是否呈现比方无效内存拜访等的反常,由此来判别该目标是否可用。用如下代码来验证咱们的主意:

var

Obj: TObject;

begin

Obj := TObject.Create; //1.创立一个目标

Obj.Free; //2.开释刚刚创立的目标,此刻内存被收回

If Obj = nil then //3.判别指针是否为空,(这一步往往不成功,由于目标

//被开释,Delphi也不会主动将目标指针置空)

ShowMessage(‘目标指针不可用。’)

else

begin

Try

If Obj.ClassType = TObject then //4.调用TObject的一个目标办法

ShowMessage(‘目标类型为TObject’);

Except

ShowMessage(‘目标指针不可用。’)

End;

end;

end;

履行上述代码,咱们发现,即便Obj.Free现已履行,Obj.ClassType仍然可用。这表明,并不是一切的目标办法一定要依赖于某个目标实例才可以拜访。究其原因,是由于这个目标办法不需求拜访某个目标实例所请求的内存。从这个意义上来说,TObject.ClassType办法并不象是一个是实在的目标办法,而颇有些类办法的滋味。

履行上述代码,咱们还可以发现,一个目标履行Free办法,仅仅将其在创立时所请求的内存开释悉数开释,可是并不影响到目标指针自身的值。目标指针仍是指向原本的内存地址。一起,由于某些目标办法(如ClassType)完成的特别性,即便目标现已被开释了,目标办法的调用成果仍然正确。

综上所述,咱们可以得出一个定论,那便是,一个目标指针是否可以被判别为是否可用,要看该目标指针所属的类,是否供给了拜访目标实例内存的途径——这个途径可所以办法,也可所以特点。那么,现在详细到各个类中,状况又怎样呢?

TObject,该类是一切类的先人类,没有办法作出判别。

TPersistent,由TObject派生而来,创立目标实例时不需求请求额定的内存,所以也没有办法判别。

TComponent,由TPersistent派生而来,增加了许多在创立目标实例时需求请求额定内存的特点,所以从理论上来说,它是可判别的。代码如下:

function ComponentExists(AComponent: TComponent): Boolean;

begin

try

AComponent.HasParent; //留意:这个语句也可认为”AComponent.Tag;”

//或许为”AComponent.Name”

result := True;

except

result := False;

end;

end;

经过调用ComponentExists,咱们可以得知一个TComponent类型的目标指针是否可用,而不论该目标指针是否现已被开释,是否被置为nil

其他类,如TControlTWinControl,或许TButton等等,只要是由TComponent派生而来,则TComponent的判别办法仍然适用。

还有其他一些用户自界说的类,若是直接由不能判别的类(比方TObjectTPersistent)派生而来,可是没有需求在实例化时请求内存的特点,那么也没有办法判别;反之,则可以。据个例子来说:

假定咱们有一个TPerson类,界说如下:

TPerson = Class(TObject)

Private

FSex: TSex; // TSex 是枚举类型的性别;

FFirstName: String;

FLastName: String;

//…

Public

property Sex: TSex read FSex write FSex;

property FirstName: String read FFirstName write FFirstName;

property LastName: String read FLastName write FLastName;

//…

end;

那么,关于TPerson类型的指针Person,可以用如下代码判别指针是否可用:

Try

Person.Sex;

//或许 Person.FirstName;

//或许 Person.LastName;

result := True; //指针可用

Except

result := False;//指针不可用

end;

 

以上咱们讨论的仅仅一种技术上的可能性。想要着重的一点是,即便有一个好的可行的办法,也不鼓舞常常这么做。由于,一个逻辑紧密的程序,原本就应可以根绝去拜访一个无效的指针。

更多文章

[文终]

 

 

本文地址:http://www.cvmachine.com/a/question/73511.html
Tags: 判别 Delphi 探求
修改:申博开户网
关于咱们 | 联络咱们 | 友情链接 | 网站地图 | Sitemap | App | 回来顶部