我有一个将动态数组TData = TArray<Byte>作为参数的过程.
procedure DoStuff(const Input: TData);
begin
// do nothing
end;
Run Code Online (Sandbox Code Playgroud)
还有一个返回动态数组的函数.
function SomeData: TData;
begin
Result := [1, 2];
end;
Run Code Online (Sandbox Code Playgroud)
当我使用下面示例中的过程时,DoStuff获取以下数据(1,2,3,1,3),但在DoStuff完成后我得到一个EInvalidPointer异常.
procedure TForm1.Button1Click(Sender: TObject);
begin
DoStuff([1, 2, 3] + SomeData);
end;
Run Code Online (Sandbox Code Playgroud)
调用DoStuff([1, 2] + SomeData);不会导致错误,当数组大于4项时,它似乎变得敏感.如果我使用临时变量来保存数组,DoStuff仍会得到(1,2,3,1,2),但没有错误.
procedure TForm1.Button2Click(Sender: TObject);
var
Temp: TData;
begin
Temp := [1, 2, 3] + SomeData;
DoStuff(Temp);
end;
Run Code Online (Sandbox Code Playgroud)
看起来像指针异常与其中一个动态数组超出范围时的释放有关.
我不应该以这种方式使用动态数组吗?工作时,这非常干净地解决了我当前的问题.
我也试过使用array of Byte;而不是TArray<Byte>;但有相同的结果.
完整的测试单位:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, …Run Code Online (Sandbox Code Playgroud)