Q&A

  • 쓰레드(Thread) 구현 코드에서 메모리 누수(Memory Leak) 원인은?
꾸~~~뻑

메일은여..요쪽으로



toto98@thrunet.com





buff : string 전역변수

s : string 지역변수

nsize :integer 지역변수

mem, p : pchar

Buff := S;

nSize := length(Buff); //256

GetMem(Mem, nSize + sizeof(LongInt)); // 메모리할당

P := Mem; // 왜 여기서 p에다가 넘기는지 그냥mem으로 구현하면 안되는지..

Move(nSize, P^, sizeof(LongInt)); // 여기는 왜 이렇게 구현을 했는지..

Inc(P, sizeof(LongInt)); // 왜 여기는 메모리 번지를 증가시켜야 하는가..

Move(Buff[1], P^, nSize); // 이건 string을 pchar로 변환



저기 저 내용을 정확히 알고 싶어여..

왜 저렇게 구현을 한것인지 말이져..

이거여..쓰레드에서 돌아가는 건데여..

메모리를 계속해서 잡아 먹어여..(나쁜 넘~)

아무리 해도 전 잡아 낼수 가 없네여..

슬픈넘~

8시간 동안 별의별 방법을 해 봤지만..대처 방법을 못 구했습니다.

여기에서

마지막에..

mem := nil;

freemem(mem);

을 해도 역시 메모리는 계속증가하고 있네여..

원래는 없었슴..



제발 살려주세엽~~~







1  COMMENTS
  • Profile
    최용일 2000.08.31 02:15
    안녕하세요. 최용일입니다.



    메일보내달라고 하지말고 직접 오셔서 보세요.



    님에게 메일보낼 시간에 코딩한줄 더하겠습니다.



    메모리를 할당받아서 포인터를 이동하면서 값을 추출하는 군요...



    > P := Mem;



    Mem을 직접 가지고 할때 포인터를 이리저리 옮긴후에 Mem의 원래 번지를 알 수 없게



    되는 경우가 있습니다. 그래서 복사본으로 작업을 하네요. Mem을 가지고 한다면 나중에



    원래의 포인터위치로 Mem값을 옮겨주어야 하죠. 그렇지 않으면 Free가 않됩니다.



    > Move(nSize, P^, sizeof(LongInt));



    이건 P에다가 nSize값을 복사하는 것입니다.



    > Inc(P, sizeof(LongInt));



    이렇게 증가시켜주지 않으면 아까 써준 값에다가 그대로 덮어써버리죠. 아까 써준 다음



    위치에다가 데이타를 쓰기 위해서 입니다.



    > Move(Buff[1], P^, nSize);



    Buff에 들어있는 값들을 nSize만큼 P에 기록을 하는것이네요...



    GetMem과 FreeMem은 항상 짝을 이루어야 하구요... 아래와 같이 하면 절대 프리되지



    않습니다. 둘을 바꿔 써주시던가.. Mem := nil;이 없어야 겠죠...



    > mem := nil; // 이순간 이전의 포인터를 잃어버리죠...

    > freemem(mem);



    이 Mem이란 포인터는 첨 8바이트에 Buff의 크기가 들어가고 그 다음 5번째 바이트부터



    Buff의 크기만큼 데이터가 저장되는 구조군요...



    ^^ 항상 즐코하세요.



    wrote:

    > 꾸~~~뻑

    > 메일은여..요쪽으로

    >

    > toto98@thrunet.com

    >

    >

    > buff : string 전역변수

    > s : string 지역변수

    > nsize :integer 지역변수

    > mem, p : pchar

    > Buff := S;

    > nSize := length(Buff); //256

    > GetMem(Mem, nSize + sizeof(LongInt)); // 메모리할당

    > P := Mem; // 왜 여기서 p에다가 넘기는지 그냥mem으로 구현하면 안되는지..

    > Move(nSize, P^, sizeof(LongInt)); // 여기는 왜 이렇게 구현을 했는지..

    > Inc(P, sizeof(LongInt)); // 왜 여기는 메모리 번지를 증가시켜야 하는가..

    > Move(Buff[1], P^, nSize); // 이건 string을 pchar로 변환

    >

    > 저기 저 내용을 정확히 알고 싶어여..

    > 왜 저렇게 구현을 한것인지 말이져..

    > 이거여..쓰레드에서 돌아가는 건데여..

    > 메모리를 계속해서 잡아 먹어여..(나쁜 넘~)

    > 아무리 해도 전 잡아 낼수 가 없네여..

    > 슬픈넘~

    > 8시간 동안 별의별 방법을 해 봤지만..대처 방법을 못 구했습니다.

    > 여기에서

    > 마지막에..

    > mem := nil;

    > freemem(mem);

    > 을 해도 역시 메모리는 계속증가하고 있네여..

    > 원래는 없었슴..

    >

    > 제발 살려주세엽~~~

    >

    >

    >