문제

C에서 해 괜찮습니까?

int *i;
// do stuff

i = NULL;

i = (int *) some_func();
// do stuff

if (i != NULL)
    free(i);

i = NULL;

// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
    free(i);

i = NULL;
도움이 되었습니까?

해결책

1) 그것은 당신이 some_func ()와 계약에 따라 다릅니다. 몇 가지 _func은 귀하가 리턴 값에서 Free ()를 호출 할 것으로 예상하면 코드가 정상입니다.

2) C의 변수를 재사용하는 것은 굉장히 우아하지는 않지만 일반적으로 다른 목적으로 다른 변수를 사용하는 것이 좋습니다. 성능과 밈 사용 관점에서 완전히 동일합니다.

다른 팁

그것은 무엇에 달려 있습니다 some_func() 하고있다. 메모리를 할당하는 경우 malloc(), 그럼 당신은해야합니다 free() 끝났을 때. 그렇지 않다면, 당신은 안됩니다. 확실히 함수의 문서를 참조하십시오.

나는 두 번째 Edgar의 답변이지만 여기에서 Null에 대한 테스트는 불필요하다는 점에 주목합니다.

if (i != NULL)
    free(i);

자유 (null)가 허용되기 때문입니다.

코드는 괜찮아 보입니다. 어떤 특정 비트에 대해 물어보고 있습니까? 그러나 함수가 int *를 반환하면 캐스트가 필요하지 않으며, 그렇지 않은 경우 int *에 할당하지 않아야합니다.

내가 보는 유일한 문제는 C에만 묶여 있지 않은 가독성 문제입니다. 한 블록으로 가변 이름을 여러 번 재사용하여 사용 된 것을 찾기가 정말 어렵습니다.

some_func이 동적으로 합의 된 메모리를 가리키는 포인터를 반환하면 예.

some_func ()가해야 할 일을하는 한 괜찮습니다. I에 유효하지 않은 (할당되지 않은) 주소를 할당하면 프로그램이 충돌하게됩니다.

some_func ()의 계약에 따라 다릅니다.

some_func ()가 메모리를 할당하고 그것을 해제 할 책임이있는 경우, 그렇지 않으면 free ()에 괜찮습니다. 사실, 버그는 아닙니다.

이것은 관리되지 않는 언어로 일하는 버그 부류 중 하나입니다. 소유 한 자원을 추적하고 공개해야합니다.

만약에 some_func() 데이터를 "소유하고"데이터 만 검사하기 위해 포인터 만 반환하면 해방해서는 안됩니다. 그 경우 malloc당신만을 위해 당신은 실제로 당신은 free

첫 단계에서

int *i;
// do stuff

i = NULL;

메모리를 할당 한 것을 지적했다면 그 기억이 영원히 손실되지 않습니까 (메모리 누출)?

예를 들어:

int *i;
i = (int*) malloc(sizeof(int);
i = NULL;

에테르에 떠 다니는 int의 크기를 메모리 덩어리로 남겨 둘 것입니다.

some_func () 예제에 대해서도 마찬가지이지만, 남은 _func ()가 남은 것을 자유롭게하려고 시도하는 것을 올바르게 테스트하고 있다고 생각합니다. 특히 some_func ()가 어떻게 작동하는지 모르는 경우.

몇 가지 _func ()가 라이브러리에서 나온 경우, 당신을 위해 작동하는 free_some_func (i) 함수가있을 수 있습니다.

i = (int *) some_func();

당신은 반환 유형의 내용을 말하지 않았습니다 some_func() 그러나, 그러나 (int *) 부분은 약간 의심 스럽다. C는 일반적으로 이러한 것들에 대해 꽤 관대하며, 일반적으로 명시적인 캐스트없이 깨끗하게 컴파일됩니다. 그렇지 않다면, 당신이하고있는 일이 당신이 원하는만큼 잘 정의되고 휴대용인지주의 깊게 고려하십시오.

@kevin montrose : hmmm.yeah, 프로그래머가 유능하다는 것을 요구하는 것은 진정한 거래 차단기입니다. 어쩌면 우리는 천장이 들어오는 경우를 대비하여 코드를 슬링하는 동안 모두 헬멧을 착용해야 할 것입니다. 그리고 "계약"은 무엇입니까? some_func? some_func 중 하나는 무료로 전달하기에 적합한 값을 반환하거나 그렇지 않습니다. 거기에는 "계약"이 없습니다. 그러나 나는 오래된 방귀이며, 경영진과 브라우니 포인트를 얻기 위해 난독 화를 믿지 않습니다. 이것들은 간단한 개념입니다.

@CAF : 이것은 아마도 컴파일러/라이브러리 종속 일 것입니다. 그가하고있는 것처럼 확인하는 것이 더 안전합니다. Null 포인터에 대한 무료 검사 구현이 모든 것을 의미하는 것은 아닙니다.

당신이 의미한다면, 각 사용마다 새 포인터를 선언하는 대신 int 포인터를 재사용해도 괜찮다는 것은 괜찮지 만 일반적으로 모든 경우 혼란 스러울 수 있습니다. // do stuff 많은 코드로 구성됩니다. 다른 프로그래머는 어디에 있는지 혼란 스러울 수 있습니다 *i 왔으며 왜 여기에서 x와 y를 의미하는지.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top