2012-03-26 2 views
2

다음 코드는 내 프로그램을 어떻게 막을 수 있습니까? 이 코드를 실행하면calloc 오류로 인해 프로그램이 손상되는 것을 방지하려면 어떻게해야합니까?

::MessageBox(NULL, L"before", NULL, MB_OK); 
void* x = ::calloc(1, -1); 
::MessageBox(NULL, L"after", NULL, MB_OK); 

가 나는이 메시지 상자 "전에"다음 "처리되지 않은 win32에서 예외"로 프로그램이 충돌합니다 ("후"메시지 상자가 표시되지 않음) 얻을.

저는 calloc이 너무 많은 메모리를 요청함으로써 충돌을 일으키는 것을 알고 있습니다! 내가 알고 싶은 것은 충돌을 막아서 컨트롤을 되 찾을 수 있고 메모리 부족을 다른 방법으로 처리 할 수 ​​있다는 것입니다.

(윈도우 XP, 비주얼 스튜디오 2005)

+2

나는 calloc에 ​​불가능한 크기를 의도적으로 전달하여 실패하게 만듭니다. 내 프로그램이 시스템의 메모리 부족으로 인해 실패 할 경우를 처리하려고합니다. 이것은 단지 그 상황을 시뮬레이션합니다 !!! – user1292915

+1

좋은 버그 리포트가 "예상되는 행동"을 포함한다는 것과 같은 정신으로'calloc()'이'NULL'을 리턴하고 프로그램을 중단시키지 않을 것이라고 기대해야한다고 말해야합니다. 그렇게하면 너무 빨리 읽은 사용자의 의견을 저장할 수 있습니다. –

+0

어쨌든 버그처럼 보입니다 : http://connect.microsoft.com/VisualStudio/feedback/details/356599/calloc-crashes-if-total-size-heap-maxreq –

답변

5

가 보이는 확인 (null를 돌려 충돌하지 않도록 해야하는) :

http://connect.microsoft.com/VisualStudio/feedback/details/356599/calloc-crashes-if-total-size-heap-maxreq

그래서 당신은 자신의 C 런타임의 최신 버전을 사용해야합니다.

+0

이것은 올바른 대답입니다. 왜 (Microsoft가 이후에 수정 한 calloc의 버그입니다.) 해결 방법은 malloc을 사용하고 memset을 직접 수행하는 것입니다. – user1292915

0

당신의 malloc을 사용하는 경우 할 수있는 단지의 경우 (X == NULL) {GetLastError()를 호출;} 내가 sugested 때문에 진짜 대답은

아니다 다른 기능이지만 작동해야합니다. 또한이 마이크로 소프트은 calloc 버그처럼 SetErrorMode

+0

SetErrorMode를 시도했습니다. Windows "처리되지 않은 win32 예외"메시지 상자를 제거하지만 프로그램은 여전히 ​​충돌합니다. :(예 : "before"메시지 상자가 나타나지만 "after"메시지 상자가 나타나지 않습니다.) malloc을 사용하면 고맙습니다. 감사합니다. – user1292915

+0

버퍼를 비우는 것을 잊지 마십시오. – user877329

관련 문제