Нужно выделить память перед копированием строки Delphi? - PullRequest
1 голос
/ 08 июня 2010

Нужно ли выделять память при выполнении копирования строки 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 ]

3 голосов
/ 08 июня 2010

Вам не нужно выделять память. На самом деле, вам даже не нужно звонить Copy. Достаточно простого назначения строки; Счетчик ссылок будет правильно отслеживаться по нескольким потокам. Вам также не нужно очищать gMsgPtr; поскольку это не переменная типа string, компилятор не будет вставлять для нее код очистки.

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

Если вы все равно хотите позвонить Copy, вам не нужно сначала вычислять длину. Он автоматически ограничит параметры индекса до максимально допустимого диапазона. Если вы хотите запросить «остаток строки», вы можете просто передать MaxInt в качестве третьего параметра, и Copy будет знать, что делать. Он также делает это для второго параметра, автоматически увеличивая любое значение как минимум до 1, самого низкого допустимого индекса символа.

0 голосов
/ 08 июня 2010

Вам не нужно выделять память для копирования строк, но вы не хотите передавать указатель на строку Delphi в этой ситуации. Вы хотите передать PChar, (также строка C), и вы do должны выделить для этого память.

...