需要在Delphi字符串复制之前分配内存吗?

时间:2010-06-07 20:49:33

标签: delphi string memory-management

执行Delphi字符串复制时是否需要分配内存?

我有一个功能,可以在我的应用程序中将Windows消息发布到另一个表单。它看起来像这样:

// Note:  PThreadMessage = ^TThreadMessage; TThreadMessage = String;

function PostMyMessage( aStr : string );
var
  gMsgPtr : PThreadMessage;
  gStrLen : Integer;
begin
  New(gMsgPtr);
  gStrLen := StrLen(PWideChar(aMsg));
  gMsgPtr^ := Copy(aMsg, 0, gStrLen);
  PostMessage(ParentHandle, WM_LOGFILE, aLevel, Integer(gMsgPtr));

  // Prevent Delphi from freeing this memory before consumed.
  LParam(gMsgPtr) := 0;
end;

2 个答案:

答案 0 :(得分:3)

您不需要分配任何内存。实际上,您甚至不需要致电Copy。简单的字符串赋值就足够了;将正确跟踪引用计数的多个线程。您也不需要清除gMsgPtr;因为它不是string类型的变量,所以编译器不会为它插入任何清理代码。

begin
  New(gMsgPtr);
  gMsgPtr^ := aMsg;
  PostMessage(ParentHandle, wm_LogFile, aLevel, LParam(gMsgPtr));
end;

如果你想要呼叫Copy,你不需要先计算长度。它会自动将索引参数钳制到允许的最大范围。当您想要“其余字符串”时,您只需将MaxInt作为第三个参数传递,Copy将知道该怎么做。它同样为第二个参数执行此操作,自动将任何值增加到至少为1,即最低有效字符索引。

答案 1 :(得分:0)

您不需要分配内存来复制字符串,但在这种情况下您不希望将指针传递给Delphi字符串。你想要传递一个PChar,(AKA一个C字符串),你必须为此分配内存。