2013-01-17 3 views
2

이 내가 나쁜 관행 모르는malloc의 결과를 보장하기 위해 malloc 루프를 사용하는 것이 좋지 않습니까?

FOO *foo; 
while (!(foo = malloc(sizeof(FOO)))) ; 
+0

한 번 실패한 후에 다시 시도 할 때 'malloc'이 갑자기 성공한 이유는 무엇입니까? –

+1

그것은 엉뚱한 것처럼 보입니다. 한 가지는 malloc이 결국 성공할 것이라는 기대를 가지고 있습니다. 어쩌면 그것은 합리적인 기대 일 수 있습니다. 아마 –

+0

. 경쟁 조건이 발생할 수 있습니다. 어쩌면 그것을 일정한 양으로 제한하거나 malloc을 호출하고 100 번만 시도하는 자신 만의 malloc 함수를 작성하십시오. –

답변

4

을? : 같은 나쁜 관행 메모리를 할당하는 것입니다,하지만 드문 일입니다. malloc() 오류는 일반적으로 프로그램에서 복구 할 수없는 주요 시스템 문제를 나타냅니다. 당신의 시스템이 다르다면 당신의 모범은 실용적 일 것입니다.

NB -이 대답은 sizeof(FOO)이 "합리적인"것으로 가정하고 너무 많은 메모리를 요구하기 때문에 malloc()이 거부하지 않는다고 가정합니다.

1

결과는 malloc()의 결과를 "보장"하지 않습니다. malloc이 NULL을 반환하면 아마도 그 이유가있을 것입니다 (예를 들어 메모리 부족). 그리고 무한 루프에 빠질 수도 있습니다.

또한, 당신이 리눅스 플랫폼에서이 작업을 실행하는 경우 기본적으로

, 리눅스는 낙관적 메모리 할당 전략을 따른다. 이것은 malloc()이 NULL이 아닌 값을 반환 할 때 메모리가 실제로 사용 가능하다는 보장이 없음을 의미합니다.

즉, malloc을 반복적으로 호출하면 Linux의 "낙관적 인"전략으로 인해 NULL이 아닌 값이 반환된다는 것을 의미합니다. NULL이 아닌 값을 지정해도 작동한다는 것을 보장 할 수는 없습니다.

이 코드는 디버깅의 악몽을 꾸미고 있다고 생각합니다.

관련 문제