2010-06-07 3 views
1

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; 

답변

0

문자열을 복사하기 위해 메모리를 할당 할 필요는 없지만이 상황에서는 포인터를 Delphi 문자열에 전달하고 싶지는 않습니다. PChar (일명 C 문자열)를 전달하려고하고 을 수행하려면에 메모리를 할당해야합니다.

3

메모리를 할당 할 필요가 없습니다. 실제로 Copy에 전화 할 필요조차 없습니다. 간단한 문자열 할당이면 충분합니다. 참조 카운트는 여러 스레드를 포함하여 정확하게 추적됩니다. gMsgPtr을 삭제할 필요도 없습니다. 이 변수는 string 유형의 변수가 아니기 때문에 컴파일러는이를위한 정리 코드를 삽입하지 않습니다. 어쨌든 Copy를 호출 할 경우

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

는 먼저 길이를 계산 할 필요가 없습니다. 인덱스 매개 변수가 허용되는 최대 범위까지 자동으로 고정됩니다. "문자열의 나머지 부분"을 묻고 싶으면 MaxInt을 세 번째 매개 변수로 전달하고 Copy은 무엇을 해야할지 알 수 있습니다. 마찬가지로 두 번째 매개 변수에 대해 자동으로 모든 값을 최소 유효 문자 인덱스 인 1 이상으로 늘립니다.

+0

나는 뭔가를 놓치고 있어야합니다. gMsgPtr에 aMsg를 지정하면 문자열의 참조 횟수가 증가합니다. PostMessage를 실행하면 참조 횟수가 감소합니다. 메시지 처리를위한 methodhandler가 마침내 실행될 때 LParam에 전달 된 문자열이 더 이상 유효한 메모리를 가리 키지 않을 수 있습니까 (일명 해방되었습니다)? –

+0

@Lieven,이 함수에 들어가면, 참조 카운트는 적어도 1이어야합니다 ('aMsg'에 저장된 참조 용). 'gMsgPtr ^'에 대한 할당은 참조를 추가하므로 적어도 2입니다.이 함수가 반환되면'aMsg'의 참조는 사라지지만'gMsgPtr ^'때문에 여전히 1 이상입니다. 메시지 처리기가 실행되면'Dispose (PThreadMessage (lParam)) '을 호출하고 참조 카운트가 다시 감소되어 문자열을 해제 할 수 있습니다. 여기에 표시된 코드는'gMsgPtr'을 해제하지 않습니다; 해당 메모리의 소유권이 메시지 수신자에게 전송됩니다. –

+0

알겠습니다. 변수가 PThreadMessage io TThreadMessage로 선언되었다는 사실을 나는 생각하지 않았습니다. 설명해 주셔서 감사합니다. –

관련 문제