문제

내가 알고 있는 것에 따라 C++표준에 새로운 메모리를 할당 하지 못했습니다 그것을 던져 std::bad_alloc 예외는 아니다.하지만 내가 들어 있는 일부의 컴파일러와 같은 VC6(또는 CRT 구현?) 을 준수하지 않습니다.이것이 진리입니까?나는 이러한 질문에 대한 검사 이후에 각각의 새로운 문 코드는 아주 예쁘게.

도움이 되었습니까?

해결책

VC6은 이와 관련하여 기본적으로 비준수였습니다. VC6 new 반환 0 (또는 NULL).

이 문제에 대한 Microsoft의 KB 기사는 다음과 같습니다. new 매니저:

VC6 동작을 위해 작성된 오래된 코드가있는 경우 이름이 지정된 MSVC 컴파일러 (7.0 이상)로 동일한 동작을 얻을 수 있습니다. nothrownew.obj. 실제로 A가 있습니다 상당히 복잡한 규칙 세트 7.0 및 7.1 컴파일러 (vs2002 및 VS2003)에서 비 던지지 또는 던지기에 기본적인지 여부를 결정합니다. new.

그것은 것 같습니다 MS는 이것을 청소했습니다 8.0 (vs2005)에서 - 당신이 구체적으로 링크하지 않는 한 항상 새로운 던지기에 기본값 nothrownew.obj.

원하는 것을 지정할 수 있습니다 new 돌려 주다 0 던지는 대신 std::bad_alloc 사용 std::nothrow 매개 변수 :

SomeType *p = new(std::nothrow) SomeType;

이것은 VC6에서 작동하는 것으로 보이므로 모든 컴파일러와 동일하게 작동하도록 코드를 기계적으로 수정하는 방법이 될 수 있으므로 기존 오류 처리를 재 작업 할 필요가 없습니다.

다른 팁

할당 시도 후 NULL을 점검하는 것이 거의 무익한 운동이라는 (다소 논란의 여지가있는) 의견을 추가하고 싶습니다. 귀하의 프로그램이 그 상황에 처해 있다면, 당신은 빨리 빠져 나가는 것보다 훨씬 더 많은 일을 할 수 없을 것입니다. 후속 할당 시도도 실패 할 가능성이 높습니다.

NULL을 확인하지 않으면 서 후속 코드는 NULL 포인터를 피하려고 시도하며, 이는 비교적 독특하고 쉽게 디버깅 할 수있는 종료 조건으로 프로그램을 빠르게 종료하는 경향이 있습니다.

나는 당신에게 null을 확인하는 것에 대해 이야기하려고하지 않습니다. 그것은 확실히 양심적 인 프로그래밍입니다. 그러나 더 많은 메모리를 할당하지 않고 회복 정보를 저장하거나 덜 중요한 메모리 등을 저장할 수있는 매우 구체적인 경우에도 그로부터 많은 것을 얻지 못하지만 대부분의 사람들에게는 비교적 드물게됩니다.

이것을 감안할 때, 나는 단지 적어도 대부분의 경우 개인적으로 Bad_alloc을 던지는 컴파일러를 믿습니다.

기반으로 C++spec,그것은 항상을 던져 std::bad_alloc 을 사용할 때는 그냥 평범한 새로운 아니라,하지만 물론이 될 수 있는 규격이 아닌 컴파일러입니다.

나는 코드를 준수하는 비 c++호환 컴파일러 하지만입니다.VC6 그들 중 하나에 이 존중합니다.

는 것이 좋습니다 하지만 항상 설정하고 포인터를 NULL 로 한 후에 당신을 삭제합니다.그래서 그 때문에,체크 NULL 은 여전히 필요합니다.

말해서,여기에 몇 가지 옵션을 청소하는 코드:

옵션 1:설정하는 새로운 처리

안전한 방법을 깨끗한 코드를 호출하는 것입: set_new_handler 첫째.

다음 확인할 수 있습니다 NULL 에서 당신의 처리기와 던져 std::bad_alloc 가 있는 경우 NULL 이 반환됩니다.

는 경우 다음과 같은 예외는 더 나은,그 다음 이것은 당신의 최선의 방법입니다.하고 싶은 경우 NULL 을 반환은 더 나은 다음을 할 수 있는 것을 잡을 내에는 새로운 처리기입니다.

옵션 2:를 사용하여 새로운 과

C++표준 헤더 파일에 정의 구조체 nothrow 은 비어 있습니다.당신이 사용할 수 있는 객체의 구조체 안에 새로운을 얻기 위해 과부 버전에는 NULL 을 반환합니다.

void* operator new (size_t size, const std::nothrow_t &);
void* operator new[] (void *v, const std::nothrow_t &nt);

그래서 당신의 코드:

 char *p = new(std::nothrow) char[1024];

좋은 refrence 를 위한 추가 읽기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top