릴리스 빌드의 성능에 영향을주지 않고 디버깅을 더 쉽게하기 위해 내 C ++ 코드에 많은 어설 션을 추가하는 경향이 있습니다. 이제는 assert
C ++ 메커니즘을 염두에 두지 않고 설계된 순수 C 매크로입니다.
반면에 C ++ std::logic_error
는 프로그램의 논리 (따라서 이름)에 오류가있는 경우 throw되는을 정의합니다 . 인스턴스를 던지는 것은 assert
.
문제이다 assert
하고 abort
, 소멸자를 호출하지 않고 즉시 프로그램을 종료 때문에 예외를 발생하는 반면 수동 런타임 불필요한 비용을 추가 정리 스킵 둘. 이 문제를 해결하는 한 가지 방법 SAFE_ASSERT
은 C와 동일하게 작동하지만 실패시 예외를 던지는 자체 assertion 매크로를 만드는 것 입니다.
이 문제에 대한 세 가지 의견을 생각할 수 있습니다.
- C의 주장을 고수하십시오. 프로그램이 즉시 종료되기 때문에 변경 사항이 올바르게 풀 렸는지 여부는 중요하지 않습니다. 또한
#define
C ++에서 s를 사용 하는 것도 나쁘다. - 예외를 던지고 main ()에서 포착하십시오 . 코드가 프로그램의 모든 상태에서 소멸자를 건너 뛰도록 허용하는 것은 나쁜 습관이며 어떤 대가를 치르더라도 피해야하며, terminate () 호출도 마찬가지입니다. 예외가 발생하면 포착해야합니다.
- 예외를 발생시키고 프로그램을 종료 시키십시오. 프로그램을 종료하는 예외는 괜찮으며으로 인해
NDEBUG
릴리스 빌드에서는 절대 발생하지 않습니다. 캐칭은 불필요하며 내부 코드의 구현 세부 정보를main()
.
이 문제에 대한 확실한 답이 있습니까? 전문적인 참조가 있습니까?
편집 됨 : 소멸자를 건너 뛰는 것은 물론 정의되지 않은 동작이 아닙니다.
logic_error
논리 오류입니다. 프로그램 로직의 오류를 버그라고합니다. 예외를 던져서 버그를 해결하는 것은 아닙니다.