怎样判断一个类变量是否已经创建了实例? ( 积分: 100 )

  • 主题发起人 主题发起人 machinecat
  • 开始时间 开始时间
M

machinecat

Unregistered / Unconfirmed
GUEST, unregistred user!
我们知道类变量实际是一个指针,创建一个实例用:v:=tclass.create
但如何判段类变量v是否已经创建了实例??若没创建实例就调用它的方法是会出错了。
已验证下列方法不行
1.if v=nil
2.if assigned(v)
3.if v is tclass
 
我们知道类变量实际是一个指针,创建一个实例用:v:=tclass.create
但如何判段类变量v是否已经创建了实例??若没创建实例就调用它的方法是会出错了。
已验证下列方法不行
1.if v=nil
2.if assigned(v)
3.if v is tclass
 
除了1、2没别的办法了 :)
 
用方法1 。

如果使用过程中,有释放这个实例的,同时请将他的变量置空。
 
释放对象的时候用 FreeAndNil,然后1,2都可以用了。
 
我是楼主,charir3,xeen的方法不行,释放是置空谁都会想到,但我的实际情况是创建后该对象被多个类变量的指向!!!!!
 
急的语无伦次了,重说
我是楼主,charir3,xeen的方法不行,释放时置空谁都会想到,但我的实际情况是创建后该对象被多个类变量所指向!!!!! 就是说有很多对象相互连接形成一个环,而且不相邻的对象间还有连接。
 
那可就没辙了,这叫悬空指针,可是令人头疼的大问题。
在Java和.net里,由于有个GC,避免了此类问题的发生。
在Delphi里没有类似的机制,除非使用接口变量来引用对象。
 
我是楼主,xeen兄,你nx,我在论坛里search了一下,提出了上前个这个问题,都没有很好的答案!这么强大的一个工具居然解决不了这个问题!唉
 
这可不是小问题啊,呵呵,要不然java 也用不着费那么大劲去作虚拟机了。
 
在其它的类中创建如下方法(你的类要继承于TComponent)
procedure Notification(AComponent: TComponent
Operation: TOperation)
override;
 
定义变量的时候要先赋为nil,释放时用FreeAndNil,或者Free后将变量赋为nil,再用你上面的方法判断就没问题
 
这的确不是一个小问题,而且很难有完美的答案.只可能根据你的实际情况折衷.
每个对象的分配内存的操作是在NewInstance.你可以继承覆盖NewInstance,并且把分配的内存(对象空间)保存到一个列表(TList)之中.(Create自然也可以)(也可以处理内存管理器,但是复杂多了).(还需要在解析的时候处理).
这样你就可以通过在TList之中查找地址来处理。不过因为有一个问题就是一个地址可能被重复利用,这就需要你根据实际情况进一步处理了.
 
---“就是说有很多对象相互连接形成一个环,而且不相邻的对象间还有连接”?
这是什么意思?难道你说的是那种五边形里面有个五角星的结构?
   要是这样,你在执行a:=TA.create后,把所有需要和a同指向的引用赋成a可不可以?
你一定是在做图论算法。
 
不是,我在做chord-----一种结构化p2p网络的仿真,是一个环结构
 
换个思路就很容易解决了, 对这个对象像com一样加个引用记数. 这样只要判断为nil就create, 不为nil表示别人已经创建了, 引用记数+1, 销毁时不是直接调用free而是另写一个方法, 该方法被调用一次就把引用记数-1, 如果引用记数<=0再调用free并把变量置nil即可
 
或是使用例外機制(try.....except) 來判斷此變量是否可使用。
 
to Another_eYes:
引用记数机制对环状的结构无效,仔细想一想就知道了。
 
if not assigned(v) then //没有创建 .... 可以呀
 
后退
顶部