2012-01-21 3 views
0
for(k=i; k<MAXRECORDS; k++) { 
    if(slist->servers_ptr[k+1] != NULL) { 
     slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
    } else slist->servers_ptr[k] = NULL; 
} 

, 나는 잘못된 크기 8for 루프에서 메모리 누수의 원인은 무엇입니까? 내가 Valgrind의 실행하면

참고 MAXRECORDS = 10의 오류가 발생하고, 배열의 크기는 MAXRECORDS입니다.

내 for 루프의 테두리 대소 문자와 관련이 있다고 가정하지만 논리적으로 어떻게 발생하는지 이해하지 못합니다.

편집 : for 루프의 마지막 라운드에서 servers_ptr[k+1]에 액세스하는 것이 배열 외부에 있으며 valgrind 오류가 발생한다는 것이 지적되었습니다. 그 이후로 내 코드를 업데이트했습니다 :

for(k=i; k<MAXRECORDS-1; k++) { 
    if(slist->servers_ptr[k+1] != NULL) { 
      slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
      if(k==MAXRECORDS-2)slist->servers_ptr[k+1] = NULL; 
    } else slist->servers_ptr[k] = NULL; 
} 

여전히 valgrind에서 오류가 발생합니다. 잘못 업데이트 했습니까?

+0

다음 내 대답은 정확합니다. –

+0

여기서 'malloc'또는 'realloc'을 수행하지 않습니다. 이 코드에서 메모리 누수 문제가 있다고 생각합니까? 나는 문제가 당신이 메모리를 할당하고있는 다른 코드 스 니펫으로있을 것이라고 생각한다. – c0da

+0

나는 명백하게 틀린 아무것도 보지 않고있다. valgrind에서 얻은 정확한 오류를 게시 할 수 있습니까? –

답변

3

servers_ptr은 크기가 MAXRECORDS입니다. for 루프의 마지막 반복에서 k == MAX_RECORDS - 1. servers_ptr[k+1]에 액세스하면 servers_ptr[MAX_RECORDS]이되며 배열의 끝에서 하나가됩니다. 이것은 정의되지 않은 동작이며 valgrind가 플래그를 지정합니다.

  for(k=i; k<MAXRECORDS; k++) { 
        if(slist->servers_ptr[k+1] != NULL) { 
          slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
        } else slist->servers_ptr[k] = NULL; 
      } 

else 절을 ​​고려하십시오. 그것의 동일 :

slist->servers_ptr[k] = slist->servers_ptr[k+1]; 

왜냐하면 우리는 if 조건에 실패했기 때문에 slist->server_ptr[k+1]이 NULL이라는 것을 알고 있기 때문입니다. 그러나 이것은 if의 두 가지가 똑같음을 의미합니다. 그래서 코드는 동일합니다 :

  for(k=i; k<MAXRECORDS; k++) { 
       slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
      } 

그래서 당신이 이런 식으로 왼쪽으로 모든 포인터를 이동하고하고 있습니다 :

[1][2][3][4][5] 
[2][3][4][5][?] 

당신의 코드가 많은 하나 개의 값을 이동하려고 당겨 끝 어딘가에서 쓰레기.

해결책은 더 적은 항목을 복사하고 마지막 셀을 특별한 경우로 처리하는 것입니다.

  for(k=i; k<MAXRECORDS-1; k++) { 
       slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
      } 
      slist->servers_ptr[MAXRECORDS-1] = NULL; 
+0

위대한 설명. 나는 이것을 시도 할 것이다, 고마워! –

관련 문제