使用CreateOleObject后释放OleVariant

kob*_*bik 7 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;
Run Code Online (Sandbox Code Playgroud)

我们是否需要V := Unassigned在最后使用代码,或者V当它存在于Test程序范围内时是免费的吗?在VB中,您将变量设置为Nothing.我们需要在这做同样的事吗?即:

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;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 9

OleVariant当它超出范围时会自动释放界面.OleVariant如果您需要更快地发布,可以为其分配新值.

  • 编译器不会在`OleVariant`上调用`_IntfClear()`."OleVariant"是OLE`VARIANT`记录的包装器,因此必须使用OLE支持函数(`VariantInit()`,`VariantClear()`等)进行管理.当`OleVariant`超出范围时,编译器应该调用`VariantClear()`.`_IntfClear()`用于释放Delphi风格的接口变量,而OleVariant则不是. (4认同)
  • 至于编码实践,你应该让`OleVariant`超出范围,除非你需要重用变量,或者有充分的理由手动释放/回收'OleVariant`的内存. (4认同)
  • 使用debug'dcu编译,并在variants.pas中的[_VarClear](http://docwiki.embarcadero.com/VCL/en/System.VarClear)过程中设置断点 (2认同)