执行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;
答案 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字符串),你做必须为此分配内存。