2017-10-25 1 views
-2

지우기 내 의심 :free() C에서 함수 사용?

내가 혼란 스러워요과 방법을 다음에서 무료 포인터에 대한 생각, 누군가가 내가 항상 무료 기능은 단지 따라서 사이의 연결을 끊는 포인터에 저장된 주소를 제거 생각

명확히 할 수 있습니다 포인터 및 블록에 할당 된 공간 마지막에 공간의 값을 쓰레기 값으로 만들고 사실상 다른 프로그램에서 자유롭게 사용할 수있게 만듭니다.

내가 잘못 이유를 지정하십시오.

을 또한 할당 한 공간에 두 개의 포인터를 가리킬 때 어떻게됩니까. 둘 다 해방하십시오. 오류/런타임 오류가 발생합니다.

+0

한 번에 한 가지 질문을하고 게시 전에 검색하여 이미 답변되었는지 확인해야합니다. _C와 같은 기본 검색을 시도 했습니까? 무료 do_ 또는 _C double free_가 무엇입니까? 이것은 [C - 메모리에 무엇을합니까?] (https://stackoverflow.com/questions/28454123/c-what-does-free-do-to-the-memory) 및/또는 [ "이중 자유"는 무엇을 의미합니까?] (https://stackoverflow.com/questions/21057393/what-does-double-free-mean) 또는 이에 상응하는 수십 가지 질문 중 하나를 선택하십시오. –

+0

도 : [무료로 포인터 값을 지우지 않는 이유는 무엇입니까?] (https://stackoverflow.com/questions/33840319/why-does-free-not-clear-out-a-pointers-value) –

답변

1

free(ptr)은 해당 인수 ptr이 가리키는 메모리 블록의 할당을 해제합니다. 즉, 블록을 사용 가능한 풀로 반환합니다. malloc()에 대한 연속적인 호출은 다른 목적으로 메모리를 재 할당 할 수 있습니다.

그러나 free()으로는 ptr 변수 하지 가변 자체의 값을 얻을 수있는 복사를 인수를 수신한다. 결과적으로 포인터를 지울 수 없습니다. 변수 ptrNULL이된다면 틀린 것입니다. 그것은 일반적인 실수입니다. 변수 값을 사용할 수 없도록하려면 free() 다음에 ptr = NULL을 할당해야합니다.

메모리 블록 자체는 다음과 같습니다. free()은 '쓰레기로 만들'의무가 없습니다. 같은 포인터로 해방 된 메모리에 액세스 할 수 있으며 그곳에 여전히 남아있는 이전 내용을 볼 수 있습니다.
그러나 에 의존하지 마십시오! 메모리는 거의 언제든지 다른 목적으로 재 할당 될 수 있습니다. (해제 된 메모리 일 수도 있습니다.도 프로세스에서 사용할 수 없게됩니다. 따라서 예측할 수없는 결과가 발생할 수 있습니다 (소위 정의되지 않은 동작).

블록을 두 번 할당 해제하려는 시도 (즉, 동일한 포인터로 두 번째 free())가 UB이기도합니다.

+0

감사합니다. 당신의 빠른 응답. 조금 더 단순하게 친절하게 설명하십시오. UB 란 무엇입니까? –

+0

@KunalChand UB = 정의되지 않은 행동 = 모든 것이 정확하고 올바른 결과를 반환하는 것처럼 계속 진행되는 프로그램에서 프로 정신 및 프로그램 종료의 갑작스런 충돌까지 불합리한 이상한 결과를 통해 모든 일이 발생할 수 있습니다. – CiaPan

+0

UB는 표준에서 정의하지 않은 동작입니다. 따라서 문제가되는 프로그램의 결과가 정의되지 않습니다. 즉, 컴파일이 실패하거나 3 년 후 무서운 휴식을 취할 때까지 100 % 완벽하게 작동하거나 심지어는 차. 즉, 절대 규칙으로 사용하지 마십시오. 그러한 행동 범주가 왜 존재하는지 질문 할 수 있습니다.음, (A) 다시 검색하면됩니다. (B) C는 빠른 언어가 아닌 안전한 언어로 설계 되었기 때문에 프로그래머가 UB를 호출하지 않고 언어를 사용하지 않고 낭비는 스스로 프로그래머를 절약합니다. –