"-fno-exceptions"를 사용하면 "new T"는 어떻게됩니까?
예외 처리를 비활성화 하는 옵션을 사용 하여 프로그램을 컴파일 하면 new T
여전히 throw 됩니까?bad_alloc
-fno-exceptions
또는 컴파일러 (GCC와 연타 지원 옵션 있음) 암시 적으로 사용 변환됩니다 new T
에를 new (nothrow) T
?
-fno-exceptions에 대한 모든 특전에 대한 확실한 답을 줄 수는 없습니다. 32 비트 리눅스 머신, gcc 4.5.1에 대한 관찰 만 있습니다.-bad_alloc은 -fno-exceptions
[21:38:35 1 ~/tmp] $ cat bad_alloc.cpp
int main()
{
char* c = new char[4000000000U];
}
[21:38:58 1 ~/tmp] $ g++ bad_alloc.cpp
[21:39:06 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
[21:39:07 1 ~/tmp] $ g++ -fno-exceptions bad_alloc.cpp
[21:39:16 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
내가 이해하는 방식 operator new
은 libstdc ++에 의해 정의됩니다. 이제를 사용하여 자신의 코드를 컴파일 -fno-exceptions
하면 예외를 포착 할 수 없지만 예외를 발생시키는 일반 버전의 libstdc ++에 대한 링크는 계속됩니다.
그래서 그래, new T
심지어 함께 예외가 발생합니다 -fno-exception
.
그러나 libstdc ++도 함께 컴파일하면 -fno-exception
상황이 달라집니다. 이제 new T
예외를 던질 수는 없지만 libstdc ++ 설명서를 읽으면 abort()
대신 호출 합니다.
new T
실패시 NULL을 반환 하려는 경우 유일한 방법은 명시 적으로 지정하는 것입니다 nothrow
...
확실한 답은 아니지만 GCC 매뉴얼 ( "없이하기"섹션 참조)에는 다음과 같은 내용이 있습니다.
에 대한 라이브러리 지원을 자세히 설명하기 전에 먼저이
-fno-exceptions
플래그를 사용할 때 잃어버린 사항에 대한 참고 사항이 있습니다.-fno-exceptions
코드에 try 또는 catch 구문이 있는지 여부 와 함께 컴파일 된 코드를 통과하려는 예외가 중단됩니다 . 던지는 코드가있을 수있는 경우-fno-exceptions
.
내가 읽은 방식 new
으로 완전히 안전 하기 위해 nothrow 버전을 명시 적으로 요청해야 할 수도 있습니다 .
많은 예외 처리 시스템에서 루틴 "foo"가 "bar"를 호출하여 차례로 "moo"를 호출하고 "moo"가 예외를 발생시키는 경우 예외가 "foo"로 명확하게 되돌릴 수있는 유일한 방법은 " bar "에는 예외를 처리하는 코드가 있습니다. "bar"가 예외가 잡히지 않게 전파되도록 할지라도, 일반적으로 실행이 범위를 벗어나도록 허용되기 전에 해당 지역 변수가 제대로 삭제되었는지 확인해야합니다. "bar"에 추가 코드를 추가해야합니다. 대부분의 시스템에서 예외가 발생하지 않더라도 일부 코드는 실행되어야합니다.
BTW, Cortex M3와 같은 일부 ARM 프로세서 또는 ARM 모드에서 실행되는 Arm7과 같이 호출자가 ARM 모드에서 실행될 경우 "보통"을 사용하여 실행 시간 비용없이 예외를 허용 할 수 있습니다. 서브 루틴 리턴은 LR + 4 (일반 리턴 주소를 넘어서 4 바이트)로 이동하고 예외적 인 종료가 LR (4 바이트 분기 명령어가 됨)로 이동합니다. 하지만 이러한 동작은 ARM의 일반적인 관행에 반하는 것이며 이러한 설계는 Cortex M0에 제대로 이식되지 않을 것입니다.
참조 URL : https://stackoverflow.com/questions/6049563/with-fno-exceptions-what-happens-with-new-t
'IT TIP' 카테고리의 다른 글
왜 어떤 사람들은“const T &”보다“T const &”를 선호합니까? (0) | 2020.12.30 |
---|---|
R 패키지의 네임 스페이스 (0) | 2020.12.30 |
Symfony2-Doctrine : ManyToMany 관계는 데이터베이스에 저장되지 않습니다. (0) | 2020.12.30 |
여러 조건으로 MySQL 조인 (0) | 2020.12.30 |
Haskell의 공분산 및 반 분산에 대한 논의가 많지 않은 이유는 무엇입니까 (Scala 또는 C #과 반대)? (0) | 2020.12.30 |