2009-05-15 2 views
1

C++에서 다음 예제의 차이점은 무엇입니까?포인터에 의한 예외 재발신

다시 던져 포인터 :

catch (CException* ex) 
{ 
    throw ex; 
} 

간단한 다시 던져는 :

다시 던지기가 잡힌
catch (CException* ex) 
{ 
    throw; 
} 

, 스택 추적은 다른 것인가?

+1

부수적으로 라이브러리에 의해 강제되지 않는 한 포인터로 catch하지 않는 것이 더 좋습니다. http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.6 –

답변

7

예. 기본적으로 첫 번째 경우에 개체를 던지고 있습니다. throw ex 줄에서 직접 예외를 생성 한 것 같습니다. 두 번째 경우에는 원래 객체가 호출 스택에 올라 가게되므로 (따라서 원래 호출 스택을 유지하는 것만 큼) 서로 다릅니다. 일반적으로 throw;을 사용해야합니다.

-2

성능 차이가 있다고 생각합니다. 두 번째 버전은 예외의 임시 복사본을 만들지 않습니다. 첫 번째 복사본을 만들 것입니다, 따라서 seond 갈 방법입니다.

간단한 예외 클래스를 만들어 시도해보고 해체 될 때 생성자/복사 생성자를 콘솔에 인쇄하도록 할 수 있습니다. 그렇게하면 차이를 볼 수 있습니다.

+0

복사본이 생성되지 않습니다. 포인터가 던져지고 있기 때문에 첫 번째 경우에 생성됩니다. –

+0

포인터가 복사되었다고 말한대로 읽었습니다. 그리고 그가 그것이 성능 차이를 만든다고 생각한 이유가 궁금했습니다. 이제 나는 그가 생각하고있는 것을 본다. 예, 포인터 만 복사되고 복사본을 생략 할 수 있습니다. –