>백엔드 개발 >C++ >왜 'new'는 때때로 예외를 발생시키는 대신 NULL을 반환합니까?

왜 'new'는 때때로 예외를 발생시키는 대신 NULL을 반환합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-21 17:53:12894검색

Why Does `new` Sometimes Return NULL Instead of Throwing an Exception?

New() NULL 예외 발생: 컴파일러 준수

C 표준에서는 다음과 같은 경우 new 연산자가 std::bad_alloc 예외를 발생시키도록 요구합니다. 메모리 할당에 실패했습니다. 그러나 일부 컴파일러, 특히 이 표준을 준수하지 않는 VC6의 동작에 대한 우려가 제기되었습니다.

VC6의 비준수

이 경우 VC6에서는 새로운 연산자가 기본적으로 표준을 따르지 않는 것으로 확인되었습니다. 대신 실패 시 0(NULL)을 반환했습니다. 이 동작은 새로운 문이 나올 때마다 NULL을 명시적으로 확인해야 하여 코드가 심미적으로 매력적이지 않기 때문에 개발자에게 문제가 되었습니다.

Microsoft의 대응 및 해결 방법

Microsoft는 이 사실을 인정하지 않았습니다. -규정 준수 및 사용자 정의 새 처리기를 사용하여 해결 방법을 제공했습니다. 또는 개발자는 nothrownew.obj 개체 파일을 활용하여 최신 MSVC 컴파일러(7.0 이상)에서 VC6의 동작을 모방할 수 있습니다.

현재 규정 준수 상태

다행히도 MSVC 8.0(VS2005)에서는 new의 기본 동작이 표준을 준수하도록 수정되었으며 이제 메모리 할당에 실패하면 std::bad_alloc 예외가 발생합니다. nothrownew.obj에 대한 링크는 원래 VC6과 유사한 동작을 원하는 경우에만 필요합니다.

수동 Null 반환 옵션

개발자는 새로운 링크를 유연하게 지정할 수 있습니다. std::nothrow를 활용하여 예외를 발생시키는 대신 0을 반환합니다. 매개변수:

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

이 기술을 사용하면 컴파일러 전반에 걸쳐 일관된 접근 방식을 사용할 수 있으며 기존 오류 처리 메커니즘을 수정할 필요가 없어 코드 유지 관리가 단순화됩니다.

위 내용은 왜 'new'는 때때로 예외를 발생시키는 대신 NULL을 반환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.