>백엔드 개발 >C++ >특히 메모리 할당 실패와 관련하여 다양한 C 컴파일러에서 'new' 연산자의 동작은 무엇입니까?

특히 메모리 할당 실패와 관련하여 다양한 C 컴파일러에서 'new' 연산자의 동작은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-17 20:14:02596검색

What is the Behavior of the `new` Operator in Different C   Compilers, Especially Regarding Memory Allocation Failure?

New Ever가 NULL을 반환할까요?

C에서 new 연산자는 새 개체에 대한 메모리 할당을 담당합니다. C 표준에 따르면 new가 메모리 할당에 실패하면 std::bad_alloc 예외가 발생할 것으로 예상됩니다. 그러나 Visual C 6(VC6)과 같은 특정 컴파일러에서는 이러한 동작이 다르다는 소문이 있었습니다.

VC6의 비준수

그 소문은 사실입니다. . VC6은 기본적으로 이와 관련하여 C 표준을 준수하지 않았습니다. new가 메모리 할당에 실패하면 예외를 발생시키는 대신 0(또는 NULL)을 반환했습니다.

Microsoft의 해결 방법

Microsoft는 이 문제를 인식하고 제안된 해결 방법을 제공했습니다. 사용자 정의 새 핸들러를 사용합니다. 개발자는 0을 반환하는 대신 std::bad_alloc 예외를 발생시키는 new 연산자의 자체 구현을 지정할 수 있습니다.

최신 MSVC 컴파일러

MSVC의 후속 버전( 7.0 이상부터) new의 동작은 더욱 복잡해졌습니다. 예외를 던질 것인지 아니면 0을 반환할 것인지를 결정하는 일련의 규칙이 있었습니다.

VS2005 and Beyond

Microsoft는 VS2005(MSVC 8.0)를 통해 마침내 정리했습니다. 이 행동. 기본적으로 new는 이제 nothrownew.obj에 명시적으로 연결되지 않는 한 std::bad_alloc 예외를 발생시킵니다.

대체 접근 방식: std::nothrow

개발자는 이를 지정할 수도 있습니다. 그들은 std::nothrow 매개변수를 사용하여 예외를 발생시키는 대신 new가 0을 반환하기를 원합니다. 이를 통해 VC6용으로 작성된 레거시 코드를 사용하더라도 컴파일러 전체에서 일관된 동작이 가능합니다.

위 내용은 특히 메모리 할당 실패와 관련하여 다양한 C 컴파일러에서 'new' 연산자의 동작은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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