2016-10-02 4 views
5

나는 다음과 같은 코드를 쓰고 있어요 : 좋은 대칭에 대한ptr = free (ptr), NULL 안전합니까?

#include <stdlib.h> 

int main(void) 
{ 
    void *kilobyte; 
    kilobyte = malloc(1024); 
    kilobyte = NULL, free(kilobyte); 
    return 0; 
} 

. 그러나 나는 전에이 관용구를 사용하여 다른 사람을 본 적이, 그래서 이것은 실제로 안전하지 않은/인자를 취하지 될 수 있다면이 Wikipedia 인용에도 불구하고, 궁금 :

In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).


편집 : 순서를 혼합. 이제 경고없이 gcc에서 컴파일됩니다. 이렇게함으로써

+0

'free'는 값을 반환하지 않으므로 선이 좋지 않습니다. 코드는 표준 ideom을 사용하여 입력하는 것이 더 적지 않습니다. – Olaf

+0

AFAIK, 쉼표 연산자는 '공짜'값인'free' 값을 버리고'NULL'을 대신 사용합니다. 그리고 ** 당신의 스타일이 그것들을 해방 한 후에도 NULL에 포인터를 일관되게 할당 할 것을 요구한다면 ** 덜 ** 입력하는 것입니다. –

+0

삭제할 가치가 없습니다! 묻기 전에 이것을 컴파일하려고 했습니까? 이것이 합법적이거나 불법이라는 증거를 찾았습니까? 섹션을 인용하십시오. (오, 나는 gcc로 시도했다.) – Olaf

답변

11

:

kilobyte = NULL, free(kilobyte); 

당신은 메모리 누수가.

kilobyte을 NULL로 설정 했으므로 가리키는 메모리가 더 이상 참조되지 않습니다. 그런 다음 free(kilobyte)을 수행하면 실제로 아무 작업도 수행하지 않는 free(NULL)을 수행하고 있습니다.

free(NULL)에 관해서는 C standard. 편집하기 전에 원래의 코드에 관해서는

7.22.3.3 The free function

1.

#include <stdlib.h> 
void free(void *ptr); 

2. The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

:

kilobyte = free(kilobyte), NULL; 

이 가진 문제는 = 운영자가 , 연산자보다 우선 순위가있다, 그래서이 사항이 효율적이라는 것이다 :

(kilobyte = free(kilobyte)), NULL; 

변수를 허용하지 않는 void으로 설정하려고합니다.

이 포인터를 해제
kilobyte = (free(kilobyte), NULL); 

은 다음 NULL 포인터를 설정 : 당신은 아마 할 들여 무엇

이있다.

코멘트에 올라프가 언급 한 바와 같이

아니라 한 줄에 모든 일을보다, 대신이 작업을 수행하는 것이 바람직 할 것이다 :

free(kilobyte); 
kilobyte = NULL; 

이 뭔가에 코드를 응축보다 독자에게 더 명확 하 다른 사람들은 이해하지 못할 수도 있으며 (지금까지 본 것처럼) 오류가 발생하기 쉽습니다.

관련 문제