2011-05-04 4 views
0

Visual Studio 2008 Windows Mobile 6.5.3 ARMV4I 프로젝트가 있습니다. std::bad_alloc 예외를 찾는 try/catch 블록을 사용하여 메모리 부족 조건을 확인합니다. 그러나 테스트를 통해 실제로 NULL 값을 반환하고 예외를 throw하지 않을 수 있음을 발견했습니다.Windows Mobile이`new` 오류시 0을 반환합니다.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int i = 0; 

    try 
    { 
     for(; i < 30000; ++i) 
     { 
      BYTE* f = new BYTE[1024]; 
      if(NULL == f) 
      { 
       NKDbgPrintfW(L"NULL - Survived %d iterations\r\n", i); 
       break; 
      } 
     } 
    } 
    catch(std::bad_alloc&) 
    { 
     NKDbgPrintfW(L"std::bad_alloc - Survived %d iterations\r\n", i); 
    } 

    return 0; 
} 

이 인쇄물은 NULL - Survived 29599 iterations입니다.

나는 nothrownew.obj과 연결되어 있지 않으며 이에 따라 std::bad_alloc 예외가 예상됩니다. http://msdn.microsoft.com/en-us/library/kftdy56f%28v=VS.90%29.aspx

누가 무슨 일이 일어나는지 알고 있습니까?

덕분에, PaulH

+0

이것은 컴파일러에 따라 다릅니다. 이것에 대한 몇 가지 옵션이 있어야합니다. 이것은 매우 일반적입니다 - 메모리 부족시 반응을위한 두 가지 방법이 있습니다 - expd :: bad_alloc 또는 new는'NULL'을 반환합니다. Apperantly, 귀하의 컴파일러는 두 번째 않습니다. 죄송합니다, VS –

+0

@Kiril에 대해 자세히 알려 드릴 수 없습니다 - 게시물 하단의 링크 별 "메모리 할당이 실패하면 C 런타임 라이브러리의 새 함수가 std :: bad_alloc 예외를 발생시킵니다." – PaulH

+2

데스크탑 * 용 C 런타임 라이브러리 *. CE의 런타임이 항상 데스크탑의 동작을 따르는 것은 아닙니다. – ctacke

답변

2

은 당신이 단순히 관찰하는 것은 컴파일러와 함께 제공되는 라이브러리가 깨진 것을 의미한다. 그것은 C++ 언어 표준의 요구 사항을 따르지 않는다는 의미에서 깨졌습니다.

new과 관련된이 특정 문제는 VC 6.0과 함께 제공되는 이전 버전의 C++ 표준 라이브러리에 존재합니다. 나중에 컴파일러/라이브러리의 일부 버전이 표준 요구 사항을 충족하도록 업데이트되었습니다. 분명히 Windows Mobile 버전은 변경되지 않았습니다.

이전 코드와의 호환성을 유지하기 위해 의도적으로 수행했을 가능성이 큽니다. 또한이 동작을 제어 할 수있는 컴파일러 구성 스위치를 확인하고 싶을 수도 있습니다. 나는 그러한 전환이 존재하는지 모른다.

0

오류 스타일은 사용 된 새 표현식의 유형에 따라 다릅니다.

5.3.4/13 : 표준이에 대한 할당 기능을 말한다

[참고 : 할당 기능 빈 예외 사양 (15.4), 던져 (선언하지 않는 한) 그것은 에 실패를 나타냅니다. bad_alloc 예외 (15 절, 18.4.2.1 절)를 던져서 저장소를 할당합니다. 그렇지 않으면 널이 아닌 포인터를 리턴합니다. 함수가 비어있는 예외 지정 인 throw()로 선언 된 경우 은 null을 반환합니다. 그렇지 않으면 에 할당하고 그렇지 않은 경우 NULL이 아닌 포인터 을 나타냅니다. ]

그런 다음 18.4.1.1/5에서 우리는 할당 함수의 nothrow 버전 만 new 표현 nothrow를 나타내는 배치 스타일이라고 배울 :

효과 : 것을 제외하고, 상기와 동일 C++ 프로그램 이 bad_alloc 예외 대신 오류 표시로 null 포인터 결과를 선호하는 경우 이 새 표현식의 배치 버전에 의해 호출됩니다.

즉, 컴파일러는 적합하지 않은 것처럼 보입니다.대부분 모바일 장치에서 예외를 지원하는 데 필요한 라이브러리 코드를 피하는 것이므로 Windows Mobile 컴파일러 설명서의 일부로 문서화되어있을 가능성이 큽니다.

관련 문제