2014-01-18 4 views
1

여기서 두 번째 "if"문을 사용하는 것을 이해하지 못합니다. 0보다 큰 "newcapacity"를 이미 테스트하고 있다면 "Tptr"을 0으로 할 수 있습니까? 다른 번호가 "newcapacity"로 "Tptr"을 0으로 만들 수 있습니까?두 번째 "if"문에 논리 오류가 있습니까?

template <typename T> 
T* Vector<T>::NewArray(size_t newcapacity) 
// safe memory allocator 
{ 
    T* Tptr; 
    if (newcapacity > 0) 
    { 
     Tptr = new(std::nothrow) T [newcapacity]; 
     if (Tptr == 0) 
     { 
     std::cerr << "** Vector error: unable to allocate memory for array!\n"; 
     exit (EXIT_FAILURE); 
     } 
    } 
    else 
    { 
     Tptr = 0; 
    } 
    return Tptr; 
} 
+2

인쇄중인 오류 메시지로 인해 이유가 분명하지 않습니까? – Barmar

+2

@Barmar : RandomPleb는 오류 메시지가 무의미하다고 생각했을 것입니다. 확실히 정상적인 던져,'new'에서 반환되는'null' 포인터를 검사하는 코드를 보았습니다. 많은 글이 '새롭지 않다'는 언급조차하지 않기 때문에 OP가 의미를 이해하지 못했다는 것이 이해할 수 있다고 생각합니다. 또 다른 주석이 지적한 것처럼,'new'를 사용한 후에 null을 체크하는 C++ FAQ 항목은'nothrow'를 언급하지 않으며 절대 컴파일러에 관한 유일한 예외를 제외하고 null을 확인할 필요가 없다는 절대적인 선언을 만듭니다. –

답변

5

그것은 그것 때문에 이전에이 라인의 필요이다 :

Tptr = new(std::nothrow) T [newcapacity]; 

위의 값은 no-throw version of new[]이며 할당에 실패하면 null 포인터를 반환합니다. 그리고 다음 줄은 반드시 new[] 할당이 실패했는지 확인하고 있다는 것을 의미합니다.

if (Tptr == 0) // Check if allocation failed 
{ 
    // Allocation has failed 
    std::cerr << "** Vector error: unable to allocate memory for array!\n"; 
    exit (EXIT_FAILURE); 
} 
+0

이제 의미가 있습니다. 감사. – RandomPleb

2

기계는 메모리가 부족하면 그 값을 가지고 nullptr를 반환하는 예외를 throw하지 말 것을 요청하면 0

-1

새 상품이 NULL 인 경우 어떻게됩니까? malloc 또는 new을 사용한 후에는 항상 확인을 취소해야합니다.

+1

및 새 던졌습니다? – neagoegab

+0

@neagoegab 우리는 std :: set_new_handler를 사용하여 처리 할 수 ​​있습니까? –

+0

"어떻게 항상 체크해야합니까?" – neagoegab

관련 문제