2011-08-24 1 views
1

Linux에서 실행되는 C++ 응용 프로그램에서 메모리 누수를 파악하려고합니다. 우리는 Valgrind 3.6.0을 사용하고 있으며 "확실하게 손실 된"스택을 거의 얻을 수 없었습니다. 이 보고서에서는 총 "확실히 손실 된"바이트 수를 기록했습니다.Valgrind는 누출을 수정 한 후에도 동일한 메모리 누수를 표시합니다.

수정 내용은 다음과 같습니다. delete ptr에서 delete[] ptr으로 변경되었습니다. 여기서 ptr은 힙의 위치 배열을 가리 킵니다.

ptr에 메모리가 충분하다는 점에 유의하십시오. 그리고 우리는 다른 많은 삭제를 유사하게 고정 시켰습니다. 따라서 우리는 누수가 줄어들 것을 기대하고있었습니다.

그러나 수정 후, 이상하게 Valgrind는 이전과 같은 누수를 여전히보고했습니다.

==00:00:15:13.661 14014== LEAK SUMMARY: 
==00:00:15:13.661 14014== definitely lost: 236 bytes in 8 blocks 
==00:00:15:13.661 14014== indirectly lost: 22,113 bytes in 17 blocks 
==00:00:15:13.662 14014==  possibly lost: 695,006 bytes in 47 blocks 
==00:00:15:13.662 14014== still reachable: 2,056,059 bytes in 732 blocks 
==00:00:15:13.662 14014==   suppressed: 0 bytes in 0 blocks 

누군가가 Valgrind의 이러한 동작에 대해 알려줄 수 있습니까? 우리는 mem_check 도구를 호출하는 모든 권리 옵션을 사용하는 등

+3

코드없이, 우리는 당신을 도울 수 없습니다. –

답변

1

대답은 valgrind이 잘못된 것을 깨달았 때문에 delete의 잘못된 종류로 해제되고 있던 블록이 처음에 누수 보고서에 포함되지 않았다이다 delete의 일종이 사용되었고 그것을보고하고 전체 블록을 자유롭게 만들었습니다.

우리는 간단한 프로그램이 효과를 볼 수 있습니다

: valgrind에서 실행할 때

int main(int argc, char **argv) 
{ 
    int *x = new int[20]; 

    delete x; 

    return x != 0; 
} 

어느, 보고서 :

==12212== Mismatched free()/delete/delete [] 
==12212== at 0x61DCD1FC: operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==12212== by 0x4005AC: main (x.c:7 in /tmp/x) 
==12212== Address 0x61fd4040 is 0 bytes inside a block of size 80 alloc'd 
==12212== at 0x61DCD967: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==12212== by 0x40059C: main (x.c:5 in /tmp/x) 
==12212== 
==12212== 
==12212== HEAP SUMMARY: 
==12212==  in use at exit: 0 bytes in 0 blocks 
==12212== total heap usage: 1 allocs, 1 frees, 80 bytes allocated 
==12212== 
==12212== All heap blocks were freed -- no leaks are possible 

는 그래서 delete의 잘못된 정렬이 사용에 대해 이야기하고있다 실제로 누설을 신고 한 후에는 누설을 신고했습니다. 실수를 한 후에 전체 블록을 실제로 해제했기 때문입니다.

누수로보고 한 사항은 전혀 시도하지 않은 것이므로 누출 요약 이전에 누출 보고서를 읽은 경우 valgrind은 누출 된 메모리가 어디 있었는지 정확히 알려줍니다 할당 된 것이므로 누출을 추적하여 해결할 수 있어야합니다.

+0

귀중한 의견을 보내 주신 TomH에게 감사드립니다. 알았다. 다른 누출을 고치려고합니다. 다시 한번 감사드립니다. –