必须在TRegEx.Create之后释放TRegEx对象吗?

use*_*348 7 regex delphi delphi-10.1-berlin

TRegEx在Delphi 10.1.2中看到了几个Delphi的使用示例,如下所示:

try
  RegexObj := TRegEx.Create(REGEX_EXTRACTEMAILADDRESSES, [roIgnoreCase]); 
  MatchResults := RegexObj.Match(ThisPageText);
  while MatchResults.Success do
  begin
    slEmailAddressesOnThisPage.Add(MatchResults.Value);
    MatchResults := MatchResults.NextMatch();
  end;
except
  on E: ERegularExpressionError do
  begin
    // Todo: Log Syntax error in the regular expression
  end;
end;
Run Code Online (Sandbox Code Playgroud)

所以我想知道TRegEx在这样的例子中创建后是否必须显式释放对象?

Rem*_*eau 9

只有派生自的类对象TObject必须在创建后从内存中显式释放. TRegExrecord不是,所以当它超出范围,它被释放. TRegEx.Create是一个构造函数,但不是在堆上创建一个新对象,只是在调用堆栈上,因此没有任何东西可以手动释放(没有为它定义析构函数).

  • 是的,但这应该是常态,而不是例外.它们永远不应该被称为*constructor*,IOW该关键字应该根本不适用于记录方法. (6认同)
  • 命名他们创建也是一个坏主意.它使读者认为他们是构造者. (5认同)
  • 正如其他人在过去所说的那样,Embarcadero调用这样的方法*构造函数*(即使用`constructor`关键字)会产生误导,因为没有*析构函数*.我宁愿看到他们调用那些方法*初始化器*并使它们返回给定类型的记录的类函数.他们应该停止称他们为施工人员,因为这个问题再一次证明了. (4认同)