2010-06-28 1 views
0

이 ATL/COM 코드가 성공적인 할당을 확인하는 이유는 무엇입니까? CoGetALloc 또는 일부 API를 통해 사용자 정의 할당이 표시 될 것으로 예상했을 것입니다. 표준을 따르는 C++ 런타임은 std :: bad_alloc을 던져야하지만, 어쩌면 할당자가 실제로 non-throwing impl에 대해 트레이드 아웃되었을 수도 있습니다.실패한 새 번호 확인

DDClientData* pNewData = new DDClientData(); 
if (pNewData==NULL) 
    return E_OUTOFMEMORY; 

답변

1

COM 메서드는 예외를 예외 처리 할 수 ​​없지만 예외는 예외를 throw 할 수 있지만 메서드를 이스케이프 처리하고 적절한 HRESULT로 변환하기 전에 처리해야합니다.

위 코드는 new이 실패하고 std::bad_alloc이 실패하고 널 포인터 검사가 실행되지 않으면 원하는 효과가 없습니다. 구현시 new 호출을 try - catch에 랩핑하거나 전체 메서드 구현을 try - catch에 랩핑해야합니다. ATL은 보통 new 호출에 대해 _ATLTRY과 같은 매크로를 사용합니다.

1

COM 예외를 사용하지 않습니다 : 모든 COM 개체가 실패 유효한 HRESULT를 반환 할 예정이다. 또한 COM 객체가 준수해야하는 이탈시 반환 값 설정에 대한 보장이 있습니다. 이러한 이유로 COM/ATL에서는 예외적으로 예외가 발생하며 Microsoft의 경우 내부적으로는 사용되지 않으며 [1] 할당되지도 않습니다. 위에 표시된 코드 샘플은 해당 규칙을 간단히 반영합니다.

[1] Sezz me, MS FTE. MS의 COM 구성 요소는 C++ 예외를 사용하지 않고 컴파일됩니다.

+0

그래서 예외를 사용하여 컴파일 중이므로 코드가 중복됩니다. –