Delphi动态数组分配给临时本地动态数组变量

Dic*_*ara 1 delphi c++builder-10.2-tokyo

新发行的delphi 10.2出现问题时,新的编译器显示错误

var 
  FGlobalVar: array of integer;

procedure SomeProc()
var
  ALocalVar: array of integer;
begin 
  ALocalVar := Pointer(FGlobalVar); {assign dynamic array}
  {Do Something}
end;
Run Code Online (Sandbox Code Playgroud)

在以前的版本中,delphi编译器不显示任何错误。

Dav*_*nan 5

该代码永远不应该编译,并且东京关闭了漏洞。该转换的问题在于引用计数可以被绕过。您所拥有的代码不会遇到这个问题,但是如果强制类型转换写在任务的左侧,则不会引用任何内容。

Pointer(LocalVar) := GlobalVar;
Run Code Online (Sandbox Code Playgroud)

以这种方式编写的代码LocalVar被分配了对动态数组的引用,但是引用计数没有增加。我很欣赏您的代码不是这样编写的,但是我相信这就是开发人员选择进行更改的原因。

无论如何,如果您使用兼容的类型,则无需在此处进行强制转换。切换至TArray<Integer>,无需强制转换。此外,您的代码将能够与通用方法进行交互。