2010-12-28 1 views
0

누설 :realloc을() I 문자열에 문자를 추가하는 기능을 가지고 메모리

void AddChToString(char **str,char ch){ 
    int len=(*str)?strlen(*str):0; 
    (*str)=realloc(*str, len+2); 
    (*str)[len]=ch; 
    (*str)[len+1]='\0'; 
} 

하고 (Mac) 인스트루먼트 Valgrind의를 표시하는 선이 (* STR) = realloc을 (* STR , len + 2)에 메모리 누수가 있습니다. 이 realloc 구현 문제가 있습니까? 아니면 부적절하게 사용하고 있습니까?

==39230== 6 bytes in 1 blocks are definitely lost in loss record 1 of 7 
==39230== at 0x100018B2D: realloc (vg_replace_malloc.c:525) 
==39230== by 0x100002259: AddChToString (in ./OpenOtter) 
==39230== by 0x10000477B: QueryMapFromString (in ./OpenOtter) 
==39230== by 0x100684CD2: ??? 
==39230== by 0x100001FB0: RequestHandler (in ./OpenOtter) 
==39230== by 0x100065535: _pthread_start (in /usr/lib/libSystem.B.dylib) 
==39230== by 0x1000653E8: thread_start (in /usr/lib/libSystem.B.dylib) 
==39230== 
==39230== 9 bytes in 1 blocks are definitely lost in loss record 2 of 7 
==39230== at 0x100018B2D: realloc (vg_replace_malloc.c:525) 
==39230== by 0x100002259: AddChToString (in ./OpenOtter) 
==39230== by 0x10000298E: ParseHTTPRequest (in ./OpenOtter) 
==39230== by 0x100004151: OpenRoutesFile (in ./OpenOtter) 
==39230== by 0x10000142B: main (in ./OpenOtter) 
==39230== 
==39230== 45 bytes in 5 blocks are definitely lost in loss record 3 of 7 
==39230== at 0x100018B2D: realloc (vg_replace_malloc.c:525) 
==39230== by 0x100002259: AddChToString (in ./OpenOtter) 
==39230== by 0x10000298E: ParseHTTPRequest (in ./OpenOtter) 
==39230== by 0x100001EB4: RequestHandler (in ./OpenOtter) 
==39230== by 0x100065535: _pthread_start (in /usr/lib/libSystem.B.dylib) 
==39230== by 0x1000653E8: thread_start (in /usr/lib/libSystem.B.dylib) 
==39230== 
==39230== LEAK SUMMARY: 
==39230== definitely lost: 60 bytes in 7 blocks 
==39230== indirectly lost: 0 bytes in 0 blocks 
==39230==  possibly lost: 0 bytes in 0 blocks 
==39230== still reachable: 1,440 bytes in 4 blocks 
==39230==   suppressed: 0 bytes in 0 blocks 

감사 : 여기서

는 Valgrind의에서 출력된다.

+0

을 어쨌든 첫 번째 간접를 사용하지 않는 경우 포인터가 포인터하는 이유는 무엇입니까? – delnan

+0

어떤 악기를 사용하고 있습니까? 가상 메모리 크기를 보여주는 것을 사용한다면, realloc()이 반환하는 경우, 문제가되지 않는다. (물론, 적어도 'realloc()'... 그 코드와 관련된 문제는 아님) – Anon

+1

NULL, 메모리 포인터를 잃어 버린다. – Nyan

답변

2

realloc 자체에 대한 호출은 메모리 누출이 아닙니다. 재 할당 된 문자열에 대한 메모리가 더 이상 필요없는 후에는 무료로 릴리스되는지 확인해야합니다.

+0

디버거가 메모리가 할당 된 곳, 누출 된 곳이 아닌 곳을 알려주는 것이 밝혀졌습니다. – Maz

+3

@Maz : 할당 된 곳은 블록을 사용하지 않으면 누설되는 부분입니다. (적어도 도구가 그것을 식별 할 수있는 유일한 방법입니다.) 그래서'AddChToString() '에 전달 된 포인터가 결코 다른 곳에서 해제되지 않았다고 말하는 것입니까? –

+1

내 잘못이 아니야 !! –

7

계측기가 실제 누출이 있거나 누출 가능성이 있음을 나타 냅니까?

을 사용하면 이 누출됩니다.realloc()이 실패하면 메모리가 누출됩니다. 이 경우 NULL이 반환되지만 원본 블록은 해제되지 않습니다. 그래서 당신은 블록에 대한 포인터를 잃어버린다. 포인터가 다른 곳에 저장되어 있지 않다면 그것을 해제 할 수 없다.

그러나 이것은 드문 경우입니다 (예 : 메모리를 모두 소모했을 때).

이 당신의 도구에 대해 불평하는 무엇, 당신 같은 뭔가 누출 경고를 해결 할 수 있어야한다 :

void AddChToString(char **str,char ch){ 
    int len=(*str)?strlen(*str):0; 
    char* tmp = realloc(*str, len+2); 

    if (!tmp) { 
     // whatever error handling is appropriate 
    } 

    (*str)=tmp; 
    (*str)[len]=ch; 
    (*str)[len+1]='\0'; 
} 
+0

'valgrind '와 같은 런타임 누출 검사기는 내가 아는 한이 종류의 검사를 수행하지 않습니다. – peoro

+0

@peoro - 응답이 작성되었을 때 사용 된 도구에 대한 특정 정보가 없었습니다. 그들의 산출물, 또는 그들이 런타임 계측기 또는 정적 검사 도구 (보푸라기 또는 유사품) 인 곳 –

+0

55 분 전에 게시 된 원본 메시지조차도 Valgrind에 대해 이야기하고있었습니다. 어쨌든 나는 당신이 틀렸다고 말하지는 않았지만, – peoro

1

시도 그 다음에 STR 변수를 얻기 위해 strcpy와 전화, 별도의 변수를 사용하여 재 할당 공백은 다음과 같습니다.

void AddChToString(char **str,char ch){ 
char *blah; 
int len=(*str)?strlen(*str):0; 
blah=realloc(NULL, len+2); 
strcpy(blah, str); 
(*str)[len]=ch; 
(*str)[len+1]='\0'; } 
2

내가 realloc에 대한 구현 문제에 대해 잘 모르겠지만,이 코드에서 메모리 누수의 기회 반드시이 다음 realloc 맨 페이지에서 :

하면 realloc()는 원래 블럭은 건드리지 않고 남아있다 실패 ; 그것은 해방되거나 움직이지 않는다.

하고, realloc 이후 반환 NULL를 실패, 당신이 메모리 누수가 있도록, 이미 할당 된 메모리 블록에 유일한 포인터를 잃고 실패하는 경우.

문제를 방지하려면, 당신은 수행해야합니다

char * temp=realloc(*str, len+2); 
if(temp==NULL) 
{ 
    /* handle the error in some way */ 
} 
else 
    *str=temp; 
관련 문제