Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用CreateOleObject后释放OleVariant_Delphi_Activexobject - Fatal编程技术网

Delphi 使用CreateOleObject后释放OleVariant

Delphi 使用CreateOleObject后释放OleVariant,delphi,activexobject,Delphi,Activexobject,下面是一个简单的代码: procedure Test; var V: OleVariant; begin V := CreateOleObject('ADOX.Catalog'); try // do something with V... finally V := Unassigned; // do we need this? end; end; 我们是否需要在末尾使用V:=Unassigned代码,或者V在Test程序的范围内是免费的? 在VB中,将变量

下面是一个简单的代码:

procedure Test;
var
  V: OleVariant;
begin
  V := CreateOleObject('ADOX.Catalog');
  try
    // do something with V...
  finally
    V := Unassigned; // do we need this?
  end;
end;
我们是否需要在末尾使用
V:=Unassigned
代码,或者
V
Test
程序的范围内是免费的? 在VB中,将变量设置为“无”。我们需要在这里做同样的事情吗? 即:


OleVariant
将在界面超出范围时自动释放界面。如果需要提前发布,您可以将新值分配给
OleVariant

如何验证?当
OleVariant
被分配给
Unassigned
Null
时会发生什么情况?使用调试“dcu”进行编译,并在variants.pas中的过程上设置断点将任何值分配给
OleVariant
(或
Variant
)在分配新值之前,将自动释放
OleVariant
当前保留的任何数据。这包括取消分配动态字符串/数组、释放接口指针等。编译器不会对
OleVariant
调用
\u IntfClear()
OleVariant
是OLE
VARIANT
记录的包装,因此只能使用OLE支持函数(
VariantInit()
VariantClear()
等)进行管理。当一个
OleVariant
超出范围时,编译器应该调用
VariantClear()
\u IntfClear()
用于释放Delphi风格的接口变量,而
OleVariant
则不是。至于编码实践,除非您需要重用变量,或者有充分的理由手动释放/回收
OleVariant
的内存,否则您应该让
OleVariant
超出范围。
function VarNothing: IDispatch;
// emulate VB function SET VarX = Nothing
var
  Retvar: IDispatch;
begin
  Retvar := nil;
  Result := Retvar;
end;

// do something with V and finally:
V := VarNothing;