2011-10-11 4 views

답변

3

예외를 사용하는지 여부에 관계없이 표준 컨테이너는 메모리 할당에 실패하면 std::bad_alloc을 던집니다 (기본 할당자를 사용하는 경우). 이것을 잡아 내지 않으면 프로그램이 종료되므로이 경우 예외를 포착하지 않고 성공을 확인할 방법이 없습니다.

예외를 근본적으로 제거하려는 경우 (내 생각에 표준 라이브러리를 사용하지 않으려는 경우에도 좋지 않은 생각) 표준 컨테이너를 버리고 원하는 컨테이너를 다시 작성해야합니다. 비표준 할당 모델을 사용하고 실패를 확인하고 전파하십시오. 표준 컨테이너는 모두 할당이 성공하거나 던질 것으로 가정하므로 보장을 제공하지 않는 할당자가 사용할 수 없습니다.

+0

이 모든 것을 잘 알고 있습니다. 고마워. – gruszczy

+0

표준은 'new' 연산자의 nothrow 버전을 설명하기 때문에 비표준 할당 모델은 필요 없습니다. 표준 라이브러리는 사용할 수 없습니다. –

+0

@MooingDuck : "비표준 할당 모델"에 의해, 표준 컨테이너 라이브러리에 지정된 할당 자 요구 사항과 다르게 작동하는 것이 었습니다. 언어 표준 외부의 것이 아닙니다. –

1

예외 사용 여부에 상관없이 C++ 라이브러리는 예외를 사용하여 할당 오류를 발생시킵니다. 정말로 피하기를 원한다면, 할당 자 또는 적어도 자신의 글로벌 연산자 new에 대해 알아야하고, 메모리를 사용할 수 없을 때 다른 스키마 (전역 변수에 함수를 호출하는 것)가 필요합니다.

+0

그러나'new'에'nothrow'를 지정할 수 있습니다. 맞습니까? 용기가 그것을 사용하지 않는 이유는 무엇입니까? – gruszczy

+0

@ gruszczy : 오류가 발생했을 때 컨테이너는 무엇을할까요? –

+1

@gruszczy : 표준 컨테이너는'new'를 사용하지 않습니다; 표준 할당 자 요구 사항을 충족시키는 유형을 사용합니다. 이러한 요구 사항 중 하나는 유효한 포인터를 반환하거나 예외를 throw하는'allocate' 함수입니다. –

0

예외는 C++ 표준의 일부가 아니므로 컴파일러 관련 동작을 수행하게됩니다. 즉, 적어도 GCC의 경우 기본 연산자 new는 malloc()이 실패 할 경우 예외를 throw하는 대신 -fno-exceptions로 컴파일하면 프로그램을 중단합니다.

1

예외를 던지기를 원하지 않는 경우에는 자신의 할당자를 작성하고지도에 사용하십시오 (typedef std::map<int, int, std::less<int>, MyAllocator> my_map;).

메모리 부족 상황을 처리하기 위해 내부 논리를 작성해야하며 표준 인터페이스는 명백한 인터페이스를 제공하지 않습니다.

하이브리드 솔루션으로 정적 메모리 풀에서 메모리를 가져 와서 전체 오류 처리기를 호출하는 할당자를 작성할 수 있습니다.

관련 문제