2016-11-11 6 views
0

확실 포인터를 해제하기 전에 null이 아니 었 만드는 데 사용, 그래서 일반적으로 다음과 같이 동적으로 생성 된 구조체를 파괴 할 자유 :는 포인터가 전에 널인지 확인하는 것이 필요한가()

Node *destroy_node(Node *node) { 
    if (node) { 
     free(node); 
    } 
    return NULL; 
} 

그러나 CERT MEM34)는 (무료로 널 포인터를 받아 이후, 나뿐만 아니라

Node *destroy_node(Node *node) { 
    free(node); 
    return NULL; 
} 

이 올 것을인가요 쓸 수 있음을 시사한다?

답변

1

예, NULL (널 포인터 상수)을 free()으로 전달하는 것은 완전히 유효합니다.

인용 C11 장 §7.22.3.3 (강조 광산)는

free 함수는 공간, 즉, 상기 할당 할 수 했다 해제 될 ptr 가리키는시킨다. ptr이 널 포인터 인 경우 아무런 작업도 발생하지 않습니다.는 [...] freeNULL 전달

0

예는 무 조작 없다. n1570에서

발췌 (C11 최종 드래프트)

7.22.3.3 프리 기능 시놉시스
1 #INCLUDE 보이드없이 (공극의 * PTR);
설명
2 free 함수를 사용하면 ptr이 가리키는 공간이 할당 취소됩니다. 즉, 더 이상 할당 할 수있게됩니다. ptr이 널 (NULL) 포인터이면 조치가 수행되지 않습니다. 그렇지 않으면 인수가 메모리 관리 함수에 의해 반환 된 포인터와 일치하지 않거나 free 또는 realloc에 ​​대한 호출로 공간 할당이 해제 된 경우 동작이 정의되지 않습니다.
반품
3 자유 함수는 값을 반환하지 않습니다.