【发布时间】:2011-11-21 13:55:57
【问题描述】:
TBytes 变量的正确使用模式是什么?据我了解,TBytes 不是一个类,而是一个“动态字节数组”。我不确定在哪里分配内存,何时释放,以及将其从生产者传递给消费者的最佳方式。我希望我的生产者创建一个 TBytes 实例,然后将其传递给消费者。发生这种情况后,生产者希望重用其 TBytes 成员变量,内容是知道消费者最终会将内存返回给系统。如果 TBytes 是一个对象,我不会有任何问题,但我不确定 TBytes 在这种情况下是如何工作的。
例如,在对象 A 中,我想将一些数据组装成一个 TBytes 数组,该数组是对象 A 的成员。完成后,我想将 TBytes 数组传递给另一个对象 B,然后它就变成了数据的所有者。同时,回到对象 A,我想开始组装更多数据,重用 TBytes 成员变量。
type
TClassA = class
private
FData: TBytes;
public
procedure AssembleInput(p: Pointer; n: Cardinal);
end;
TClassB = class
public
procedure ProcessData(d: TBytes);
end;
var
a: TClassA;
b: TClassB;
procedure TClassA.AssembleInput(p: Pointer; n: Cardinal);
begin
SetLength(FData, n);
Move(p^, FData, n); // Is this correct?
...
b.ProcessData(FData);
...
// Would it be legal to reuse FData now? Perhaps by copying new (different)
// data into it?
end;
procedure TClassB.ProcessData(d: TBytes);
begin
// B used the TBytes here. How does it free them?
SetLength(d, 0); // Does this free any dynamic memory behind the scenes?
end;
提前致谢!
【问题讨论】: