2010-01-18 4 views
2

Delphi에서 오래된 미디 구성 요소를 실행하려고하고 있는데 대부분의 경우 작동하지만 행에 2 개의 파일을로드하려고하면 충돌이 발생합니다.getmem memory leak, delphi

일부 연구는 코드에서 메모리 누출을 가리키는 EurekaLog를 설치하도록 유도했습니다. 예!

나는 메모리 포인터와 잘 어울리지 않지만,이 코드는 유레카에 의해 강조되어있다. 나를 생각해 보았다. 아마도 메모리가 해제 된 버그가 있을까?

끝에 FreeMem을 추가하려고했지만 작동하지 않습니까?

function TMidifile.ReadString(F: integer): string; 
var 
    s: PChar; 
    i: integer; 
begin 
    GetMem(s, F + 1); 
    s[F] := chr(0); 
    for i := 0 to F - 1 do 
    begin 
    s[i] := Chr(chunkIndex^); 
    inc(chunkIndex); 
    end; 
    result := string(s); 
end; 
+0

우선 FreeMem을 부른 후 "작동하지 않습니다"라는 의미는 무엇입니까? 둘째, 델파이의 어떤 버전을 사용하고 있습니까? –

답변

2

AnsiString은 참조 카운트이므로 AnsiString으로 변환 할 수 없습니다.

쉬워 보이지 않습니까?

function TMidifile.ReadString(F: integer): string; 
var i: integer; 
begin 
    SetLength(Result, F); 
    for i := 1 to F do 
    begin 
    Result[i] := Chr(chunkIndex^); 
    inc(chunkIndex); 
    end; 
end; 
+0

이것은 사건을 해결 한 것으로 보입니다! 나는 더 이상 유출 된 기억의 경고를 얻지 못한다 :) 마술 수정에 감사드립니다! ** 시험 중 ** –

+0

@Dom : 좋습니다! 다행히 도왔다. :) –

+0

나는 코드의 작은 부분을 가르쳐 준 적이 없다. 나는 놀랐다. –

0

문제는 임의의 바이트를 가져 와서 string으로 전송할 수 없다는 것입니다. 은 특정 구조를 가지며 할당은 컴파일러에서 관리합니다.

이 비트를 다시 작성할 수는 있지만 메모리 관리 측면에서이 코드를 호출하지 않는다고 가정해야하므로 필자는 별다른 도움이되지 않는다고 생각합니다.

3

코넬 (Kornel)이 올바른 생각을 가지고 있습니다. 당신은 아마과 같이, 더욱 그것을 단순화 수 있습니다 : 당신이 FastCode 프로젝트 버전과 함께 제공 이동의 FastCode 프로젝트 버전 (또는 델파이의 최신 버전을 사용중인 경우 특히

function TMidifile.ReadString(F: integer): AnsiString; 
begin 
    SetLength(Result, F); 
    Move(ChunkIndex^, result[1], F); 
    inc(chuncIndex, F); 
end; 

이것은, 훨씬 더 빨리 읽는 것 RTL에 내장되어 있습니다.)

+1

+1 : 나는 그것을 테스트 할 수있는 컴파일러가 없기 때문에 '이동'방법을 감히하지 않았다.> –

+0

@Mason : Dom이 Delphi 2009를 사용하고있을 수 있으므로주의해야한다. 이상으로 이동하면 문자가 아닌 바이트가 이동합니다. –

+0

좋은 지적. 이를 고려하여 편집했습니다. –