2010-08-02 5 views
4

일반적으로 포인터가 두 번 해제되면 두 번 사용 가능합니다. 예 :C에서 두 번 사용 가능합니까?

char *ptr; 
ptr=malloc(5 * sizeof(*ptr)); 
free(ptr); 
free(ptr); 

위 코드는 이중으로 간주됩니다. 다음은 이중 무료로 간주됩니까?

char *ptr; 
char *ptr1; 
ptr=malloc(5 * sizeof(*ptr)); 
ptr1=ptr; 
free(ptr); 
free(ptr1); 

감사합니다.

+0

두 번째 예는 매달려있는 포인터 –

답변

10

예. 라이브러리는 소스 코드에 어떤 이름을 부여했는지 신경 쓰지 않습니다 (코드가 실행될 때까지 오랫동안 사라졌습니다). 중요한 것은 모두 값이고이 경우 free()에 전달 된 값은 같습니다.

10

예. 같은 메모리를 두 번 비우는 중입니다.

+0

(일부 불쾌한 오류 및 충돌을 유발할 수 있음) –

0

예. double free는 이미 해제 된 메모리 블록을 해제하려고 할 때입니다. ptr과 ptr1 모두 동일한 메모리 블록을 가리키고 있으므로 free에 대한 두 번째 호출은 이미 해제 된 메모리 블록을 해제하려고 시도하고 있습니다.

0

예, 포인터가 동일한 주소를 가리 키므로 같은 주소를 공백으로 전달하십시오.

당신은

printf("%p", ptr); 

그것을 인쇄하여 포인터의 값이 무엇인지 표시하거나 디버거에서 볼 수

0

예이 이중 무료 (그리고 할 수있는 매우 나쁜 일이)입니다 . ptr1은 malloc에 ​​의해 할당 된 메모리에 대한 포인터입니다. 그것은 ptr이 가리키는 위치와 같습니다. ptr과 ptr1을 해제하면 동일한 메모리가 두 번 해제됩니다.