2013-09-24 6 views
3

b_destroy 함수를 호출하면 함수가 끝나기 전에 프로그램이 충돌합니다. 이 기능은 다음과 같습니다 Free() 프로그램이 충돌 함

void b_destroy(Buffer * const pBD){ 
#ifdef DEBUG 
printf("IN DESTROY\n"); 
printf("BUFFER ADDRESS %d\n",pBD); 
printf("HEAD ADDRESS %d\n",pBD->ca_head); 
#endif 
if(pBD != NULL || pBD->ca_head != NULL){ 
    if (pBD->ca_head != NULL) 
     free(pBD->ca_head); 
    if (pBD != NULL) 
     free(pBD); 
} 
#ifdef DEBUG 
    printf("EXITING DESTROY\n"); 
#endif 
} 

은 내가 메모리 위치를 출력 할 수이기 때문에 포인터하지 NULL 알고있다. 왜 충돌하는지 모든 아이디어?

+0

:

if(0 || 0->ca_head != NULL) { // that 0-> will seg fault } 

어쩌면 당신이 뭔가를 원하는 더 많은 정보를 알려주세요 –

+0

포인터가 null이 아니기 때문에 그것이 유효하다는 의미는 아닙니다. –

+4

논리가 잘못되었습니다. 'pBD'가 실제로 null 일 경우 어떻게되는지 생각해보십시오. – Mat

답변

1

주소가 null이 아니라 데이터가 이미 해제 된 것이 중요합니다. 같은 메모리가 이미 해제되었는지 확인하기 위해 다른 곳을 검색해야합니다. Free는 주어진 포인터를 이후에 null로 설정하지 않습니다.

2

포인터를 비울 때 포인터를 즉시 NULL로 설정해야합니다. 그렇지 않으면 프로그램에서 충돌이 발생할 수 있습니다. 그게 당신 프로그램의 경우 일 수도 있습니다. 또한 항상 % x (메모리 주소 용) 형식 지정자를 사용하고 % d (부호있는 정수의 경우)를 사용하여 주소를 인쇄하십시오.

전체 프로그램을 살펴보고 문제를 찾아야합니다. 문제를 해결할 수있는 모든 장소에서 포인터를 NULL로 설정 한 후 시도하십시오.

+0

이 함수를 호출하는 드라이버 코드는 호출 된 후에 포인터를 NULL로 설정합니다. –

+0

'모든 장소에서 해제 한 후 NULL 포인터 설정 '에 동의하십시오. 참고 : OP 함수는 여기에'pBD'가'const'라는 의심스러운 이유 때문에 허용하지 않을 것입니다. – chux

2

여기 당신의 논리에 대해 신중하게 생각 : PBD가 0

if(pBD != NULL || pBD->ca_head != NULL) 

경우에, 당신의 논리는 다음과 같습니다 당신이 필요로하는 경우

if (pBD && pBD->ca_head) 
    free(pBD->ca_head); 
if (pBD) 
    free(pBD); 
+0

참으로 고마워. 이미 고마워. –

관련 문제