2011-01-30 2 views
2

내가 알고있는 경우 new(std::no_throw)은 실패한 경우 NULL에 대한 포인터를 설정합니다. 정상적인 경우 new은 실패한 경우 std::bad_alloc 예외를 발생시킵니다.std :: bad_alloc을 throw하면 새 포인터가 NULL로 설정됩니까?

new도 던졌습니다 경우 NULL 포인터를 설정합니까? 또는 catch() 블록의 NULL으로 설정해야합니까?

답변

6

C++에서는 new 호출이 이루어지기 전에 어떤 것이 든 될 수 있도록 new이 예외를 throw합니다 (std :: nothrow를 사용하지 않는 한) 포인터가 할당되지 않습니다.

그러나 질문에 언급 한대로 new이 실패 할 경우 null을 반환하는 것에 대해 이야기하는 this article에 관심이있을 수 있습니다.

0

예외가 throw되면 catch이 예외를 중지 할 때까지 스택이 해제 (로컬 객체의 소멸자 실행 중)됩니다. 자동으로 포인터를 NULL으로 설정하는 것은 아무것도 없으며 소멸자 중 하나가 그렇게하는 것은 당연한 일입니다. 그렇게 한 인위적인 예제가 될 것입니다.

일반적으로 포인터를 NULL으로 설정할 필요가 없습니다. 사실, 종종 그렇게 할 수는 없습니다. 다음 코드를 가져옵니다.

try { 
    std::string s("hello, world"); 
} catch (std::bad_alloc) { 
// ??? 
} 

이러한 12 바이트의 할당이 실패 할 수 있습니다. 예외는 std::string의 생성자에서 반환됩니다. 이 시점에서 객체 s은 더 이상 존재하지 않으며 s._SomeInternalName 내부에 s의 포인터도 존재하지 않습니다. 컴파일러는 catch 블록에 s을 사용하려고하면 오류를보고합니다. 그리고 포인터가 더 이상 존재하지 않으면 분명히 0으로 설정할 수 없습니다.

관련 문제