2012-05-23 1 views
5

코드는 다음과 같다 :C에서 정적 변수와 자동 변수를 free() 할 수 있습니까?

#include <stdlib.h> 

int num = 3; // Static external variable 
int *ptr = &num; 

int main(void) 
{ 
int num2 = 4; // Automatic variable 
int *ptr2 = &num2; 

free(ptr); //Free static variable 
free(ptr2); //Free automatic variable 

return 0; 
} 

나는 위의 코드를 컴파일하려고하고 내가 할 수 free() 기능은 정적 변수도 자동 변수를 모두 무료로 않습니다 궁금 작품? 아니면 기본적으로 아무것도하지 않습니까? 메모리 할당 함수 (malloc, calloc 등)으로 반환되지 포인터에 free() 호출

+1

"작품"을 충분히 낮은 품질로 정의하는 데 "효과적"입니다. 동일한 시스템, 동일한 컴파일러 또는 다른 컴파일 옵션에서도 충돌이 발생할 수 있습니다. ** ** 정의되지 않은 동작 ** - 아무거나 일어날 수 있습니다. 예상했던 것조차도 가능합니다. – Jens

답변

12

는 정의되지 않은 동작시킨다.
코드에 정의되지 않은 동작이 있으므로 컴파일러에서 모든 진단을 제공 할 필요가 없으며 모든 동작을 표시하거나 작동하거나 충돌 할 수 있습니다.

유일한 해결책은 정의되지 않은 동작을 발생시키는 코드 작성을 피하십시오.

+0

NULL 포인터에서 정의 된 동작이므로 free()를 호출 할 수도 있습니다. * 같은 * 포인터에서 free()를 두 번 호출하지 않도록하십시오. –

+0

두 번 무료로 시도하면 어떻게됩니까 ?? – caramel1995

+0

@ caramel23 : 모두 당신은 정의되지 않은 행동임을 보증 할 수 있습니다. –

5

그렇게해서는 안됩니다. free은 계열의 함수에 의해 힙에서 동적으로 할당 된 메모리에만 사용됩니다.

num의 메모리는 데이터 세그먼트에 정적으로 할당되며 해제 할 수 없습니다. num2의 메모리는 main의 호출 스택 프레임에 할당되며 main이 반환되는 즉시 해제됩니다.

실제로 발생하는 현상은 free의 구현에 따라 다릅니다. 일반적으로 힙에 유지 관리되는 특정 데이터 구조가 있습니다. malloc/free은 할당 된 메모리 영역과 사용 가능한 메모리 영역을 추적합니다. free은 이러한 데이터 구조가 인수가 가리키는 곳 주변에있을 것으로 예상합니다. malloc 할당 된 힙 영역을 가리 키지 않는 포인터를 전달하면 가비지 데이터를 유용한 정보로 간주하여 이상한 일을하게됩니다. 그리고 그 결과가 바로 프로그램 충돌 일 경우 운이 좋다.

관련 문제