【发布时间】:2017-10-24 13:49:02
【问题描述】:
我有一个将动态数组TData = TArray<Byte> 作为参数的过程。
procedure DoStuff(const Input: TData);
begin
// do nothing
end;
还有一个返回动态数组的函数。
function SomeData: TData;
begin
Result := [1, 2];
end;
当我使用下面示例中的过程时,DoStuff 会获取以下数据 (1, 2, 3, 1, 3),但在 DoStuff 完成后我会收到 EInvalidPointer 异常。
procedure TForm1.Button1Click(Sender: TObject);
begin
DoStuff([1, 2, 3] + SomeData);
end;
调用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;
看起来指针异常与其中一个动态数组在超出范围时如何被释放有关。
我不应该以这种方式使用动态数组吗?工作时,这非常干净地解决了我当前的问题。
我也尝试过使用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, Vcl.StdCtrls;
type
TData = TArray<Byte>;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure DoStuff(const Input: TData);
function SomeData: TData;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
DoStuff([1, 2, 3] + SomeData);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Temp: TData;
begin
Temp := [1, 2, 3] + SomeData;
DoStuff(Temp);
end;
procedure DoStuff(const Input: TData);
begin
// do nothing
end;
function SomeData: TData;
begin
Result := [1, 2];
end;
end.
【问题讨论】:
标签: arrays delphi dynamic-arrays