2012-06-19 2 views
5

out of memory을 제외한 malloc을 사용하여 메모리 할당 중에 발생할 수있는 오류는 무엇입니까? 이러한 오류를 처리하는 가장 좋은 전략은 무엇입니까?malloc 오류 처리

out of memory exception의 경우 메모리 할당이 실패하더라도 포인터를 해제해야합니까?

+2

실생활은 표준 리눅스에서'malloc' 호출이 성공할 수는 있지만 메모리가 실제로 사용 가능하지 않고 프로세스가 종료됩니다. 운영체제는 기본적으로 메모리를 초과 구독합니다 *. 대개 큰 문제는 아닙니다. –

+1

고맙게도이 기본값은 Linux 시스템이 Win95보다 좋게 행동하기를 바라는 사람들이 쉽게 고칠 수 있습니다 ... ('echo "2 />/proc/sys/vm/overcommit_memory') –

답변

11

C에서는 예외가 없습니다. 어쨌든 언어에서는 사용할 수 없습니다. 따라서 malloc이 실패 신호를 보낼 수있는 유일한 방법은 null 포인터입니다. 그래서 당신은 반환 값을 확인해야합니다. 0 인 경우 할당이 실패하고 (할당 된 이유없이) 할당 된 메모리가 없습니다. 아무 것도 해제하지 않습니다. 그렇지 않으면 요청 된 양 (*)에 대한 할당이 성공했으며 더 이상 필요하지 않을 때 메모리를 비워야합니다.

(*) 오버플로에주의하십시오. mallocsize_t 매개 변수를 취합니다.이 매개 변수는 대부분 부호없는 숫자입니다. 부호가없는 size을 사용하여 size * sizeof(int) 바이트를 요청하고 곱셈이 오버플로하면 (아마도 size의 값을 가져 오는 중 오류가 발생 함) 결과는 작은 수입니다. malloc()는 아마도 세그먼트 오류 결과 size의 실제 (대) 값, 또는 메모리가 부족 상당

+1

당신은 오버 플로우에 대해 좀 더 구체적으로 설명 할 수 있습니까 –

+0

@AmanDeepGautam - 업데이트 – Attila

+0

감사합니다!를 참조하십시오.나는 그것을 얻었다 –

0

에 기초하여 리턴 된 배열로 비 - 널 및 인덱스 복귀 바이트이 작은 번호를 할당 할 유일하게 감지 할 수있는 오류입니다 ... 이미 해제 된 메모리를 해제하는 등의 다른 오류로 인해 충돌이 발생할 수 있습니다.

C에서 메모리 부족 체크를위한 한 가지 전략은 메모리 부족을 확인하는 malloc 및 realloc (아마도 xmalloc 및 xrealloc이라고도 부를 수 있음)에 대한 래퍼를 사용하는 것입니다. 그러면 오류 동작을 취합니다 ... 메시지 인쇄 종료하거나 메모리 풀을 비우고 할당을 다시 시도 할 수 있습니다. 이렇게하면 모든 테스트가 한 곳에서 이루어지며 일관된 실패 메시지가 생성되고 모든 할당 시도가 실패했는지를 확인할 수 있습니다. 아래 단락에서 가능한 단점이 논의됩니다.

역사적으로이 전략은 C 코드에서는 드물었습니다 (이 고대 언어로 작성된 코드 전반에서 일반적으로 낮은 품질과 일치 함). 그러나 요즘 일부 성숙한 라이브러리 프레임 워크는 이런 종류의 것을 통합합니다 (구현은 원하는 것을 남겨 둡니다. 다시, 아래의 설명을보십시오). 매우 권장할만한 또 다른 접근법은 C를 포기하고보다 현대적인 언어로 이동하는 것입니다. C++ 일 수도 있고 new의 실패로 인해 bad_alloc 예외가 발생합니다.

귀하의 질문에 ... malloc가 실패하면 NULL을 반환합니다. 무료 포인터가 없습니다. (free (NULL)은 no-op 임). realloc이 실패하면 원래 할당은 변경되지 않습니다. 이러한 것들은 매뉴얼 페이지 나 사양을 읽으면 알 수 있습니다. http://pubs.opengroup.org/onlinepubs/7908799/xsh/realloc.html

+1

-1의 배열을'malloc'에 할당 할 때, 매우 해롭지 만 퍼베이시브 프로그래밍을 폐지해야합니다. 그 주위를 돌아 다니는 일은 없습니다. 당신은'malloc'의 실패를 처리해야하며, 래퍼로 처리 할 수있는 "쉬운"방법은 없습니다. 프로그램을 중단하는 래퍼는'malloc' 실패를 확인하지 않는 * 깨진 코드 *를 작성하기 쉽습니다 (래퍼가 실패를 반환하지 않는다고 가정 할 수 있기 때문에). 그리고이 깨진 코드를 수정/재구성하는 것은 거의 불가능합니다. 강력한 소프트웨어에서 사용할 수 있습니다. GMP와 glib와 같은 주요 라이브러리는이 문제로 어려움을 겪고 있습니다. –

+0

그건 완전히 썩어. –

+0

설명해 주시겠습니까? –

1

이것은 제품 플러그처럼 보입니다.하지만 우리의 글에서 CheckPointer에있는 다양한 종류의 메모리 할당 오류를 읽을 수 있습니다. 그러한 할당 실수를 포함한 메모리 관리 오류.