2011-03-17 8 views
3

내가 다음 코드의 결과에 약간의 차이를 보았다 :C 함수가 작동하는지 어떻게 알 수 있습니까?

#include <stdio.h> 
#include <malloc.h> 
#include <string.h> 

int main(void) 
{ 
char* ptr; 
ptr = (char*)malloc(sizeof(char) * 12); 
strcpy(ptr, "Hello World"); 

printf("%s\n", ptr); 
printf("FREEING ?\n"); 

free(ptr); 

printf("%s\n", ptr); 
} 

는 설명해 드리죠 없습니다 : 나는 다른 결과를 얻을 OS를 따라 printf와 세 번째 호출에서

, 윈도우에서 gargabge의 caracters, 아무것도 Linux 및 Unix 시스템에서는 "Hello World"가 인쇄됩니다.

메모리가 해제되었을 때 포인터의 상태를 확인하는 방법이 있습니까?

인쇄 메커니즘은 항상 신뢰할 수 없다고 생각합니다.

Thnaks.

인사말.

+2

포인터를 놓아도 포인터가 가리키는 실제 메모리가 반드시 변경되는 것은 아닙니다. – Gabe

답변

8

포인터가 해제 된 후에 포인터를 사용하면 정의되지 않은 동작이 발생합니다.

즉, 프로그램에서 가비지를 인쇄하거나 문자열의 이전 내용을 인쇄하거나, 하드 드라이브를 지우거나, 원숭이를 바닥에서 튀어 나오게 할 수 있으며 여전히 C 표준을 준수 할 수 있습니다.

포인터를보고 "메모리가 해제 된시기를 아는"방법은 없습니다. 프로그래머가 계속 추적하는 것은 개발자의 몫입니다.

3

간단한 ansewr : 포인터가 이미 C에서 해제되었는지 확인할 수 없습니다. 다른 동작은 아마도 다른 컴파일러 때문일 수 있습니다. 포인터를 사용하면 포인터를 사용하여 정의되지 않았으므로 모든 동작을 얻을 수 있습니다 (예 : SEGFAULT 및 프로그램 종료).

무료 속성을 사용하고 프로그램에 메모리 누수가 없는지 확인하려면 Valgrind와 같은 도구를 사용하십시오.

5

free()를 호출하면 해당 함수가 반환 될 때 메모리가 해제됩니다. 그렇다고 메모리를 즉시 덮어 쓰지는 않겠지 만 free()라고 불렀던 포인터를 사용하는 것은 안전하지 않습니다.

해제하면 포인터 변수에 항상 nil을 할당하는 것이 좋습니다. 그렇게하면, 무제한 포인터를 사용하는 것이 안전하다는 것을 알 수 있습니다.

+1

+1 -'free()'를 호출하면 메모리가 해제됩니다. – detly

관련 문제