Delphi 문자열 복사본을 수행 할 때 메모리를 할당해야합니까?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;
나는 뭔가를 놓치고 있어야합니다. gMsgPtr에 aMsg를 지정하면 문자열의 참조 횟수가 증가합니다. PostMessage를 실행하면 참조 횟수가 감소합니다. 메시지 처리를위한 methodhandler가 마침내 실행될 때 LParam에 전달 된 문자열이 더 이상 유효한 메모리를 가리 키지 않을 수 있습니까 (일명 해방되었습니다)? –
@Lieven,이 함수에 들어가면, 참조 카운트는 적어도 1이어야합니다 ('aMsg'에 저장된 참조 용). 'gMsgPtr ^'에 대한 할당은 참조를 추가하므로 적어도 2입니다.이 함수가 반환되면'aMsg'의 참조는 사라지지만'gMsgPtr ^'때문에 여전히 1 이상입니다. 메시지 처리기가 실행되면'Dispose (PThreadMessage (lParam)) '을 호출하고 참조 카운트가 다시 감소되어 문자열을 해제 할 수 있습니다. 여기에 표시된 코드는'gMsgPtr'을 해제하지 않습니다; 해당 메모리의 소유권이 메시지 수신자에게 전송됩니다. –
알겠습니다. 변수가 PThreadMessage io TThreadMessage로 선언되었다는 사실을 나는 생각하지 않았습니다. 설명해 주셔서 감사합니다. –