如何在创建中释放自己(50分)

  • 主题发起人 主题发起人 ljhuacn
  • 开始时间 开始时间
L

ljhuacn

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在Create中释放自己.有可能吗?
 
为什么这样做? 错误处理吗? 你应该在create里面raise一个exception
 
这样做目的是什么?
 
在创建一个对象时,我想把判断放在对象的Create中,例如:
TMyObject.Create(Name : string;Parent : TMyObject)
begin
if Parent.ByName(Name) <> nil then
Self.free;//释放自己
end;
 
哦!這樣啊試試下面的!
TMyObject.Create(Name : string;Parent : TMyObject)
begin
if Parent.ByName(Name) <> nil then
close /////Self.free;//释放自己
end;

TMyObject.close……………………
begin
action:=cafree;
end;
 
to:ljy_17
你写是从TForm继承的吧.
试过了,还是不行,用TForm还是释放不干净.
 
如[一个过客]所说的: “你应该在create里面raise一个exception”
或使用abort不发出讯息的中止create
 
创建的时候发生异常,自动free
但是一般来说不应该让构造函数中出现异常,如果有的话调用构造函数的程序如果再将
对象Free就会出现错误了。

xxx := Txxx.Create;
try
...
finally
xxx.free
//如果xxx已经释放了,这里有会有错误,导致流程难控制了
end;
 
To Adnil:
如果在Txxx.create;就抛出异常,就不会执行finally程序块了,直接退出本过程了。
在try 。。。finally 抛出的异常才会在finally..end段处理异常.
 
我上面说的是如果他没有抛出异常,而是自己释放,会出现上述错误
 
我觉得如果实在有必要释放自己的话,加个abort即可
因为一个构造函数产生异常会自动释放
见system中的
function _ClassCreate(AClass: TClass
Alloc: Boolean): TObject;
有这么一段
@desc:
JMP _HandleAnyException

{ destroy the object }

MOV EAX,[ESP+8+9*4]
MOV EAX,[EAX].TExcFrame.ConstructedObject
TEST EAX,EAX
JE @@skip
MOV ECX,[EAX]
MOV DL,$81
PUSH EAX
CALL dword ptr [ECX].vmtDestroy
POP EAX
CALL _ClassDestroy
@@skip:
{ reraise the exception }
CALL _RaiseAgain
可以看到这就是当构造函数有异常会自动释放
加一abort产生EAbort,产生一安静的异常,被Application所丢掉,
同时构造该对象下面的代码也不会执行
 
to xzgyb:
非常感谢您的解释.
 
后退
顶部