2011-08-14 5 views
11

리소스를 보면 두 가지 방법으로 메모리를 할당하는 동시에 작업을 완료하는 데 충분한 메모리가 있는지 확인할 수 있습니다.메모리가 부족한 상태에서 C++로 메모리를 올바르게 할당하는 방법

1 은)는 표준 : : bad_alloc 뿐이다을 반환 할 것이기 때문에))

try { ptr = new unsigned char[num_bytes]; } catch(...) {} 

2? (시도/캐치에서 '새로운'작업을 감싸는 '새로운'작업 후에는 null에 할당 된 포인터를 확인 .

ptr = new unsigned char[num_bytes]; if(ptr == NULL) { ... } 

어느 것이 옳은가요? 둘 다 작동합니까? 아마 1과 2 둘 다해야할까요? 1이 올바른지 있도록

감사합니다,

jbu

답변

16

new 표준 구현을 사용하는 경우 예외가 발생하면 첫 번째 것은 올바른 것입니다. '

ptr = new (nothrow) unsigned char[num_bytes]; 
if(ptr == NULL) { ... } 
+1

이것은 아마도 내가 대신해야 할 코드 양을 줄이기 위해서입니다. – jbu

+0

@jbu : 일부 코드는 예외를 제외하고 컴파일됩니다. 이것은 비표준이며,이 경우 컴파일러 문서를 읽을 필요가 있습니다 만, 실패하면'new'가 0을 반환 할 가능성이 있습니다. –

5

성공하지 할당 [new를 사용]을 std::bad_aloc가 발생합니다.

malloc [C에 예외가 없으므로 할당 실패를 나타내는 데 NULL이 사용되었습니다]를 사용하면 두 번째가 c 코드에 사용됩니다.

new을 사용하는 경우 할당이 실패한 경우 예외가 throw되고 if 문에 도달하지 않으므로 if 문이 true가됩니다. 물론 할당이 성공하면 if 문은 false를 반환합니다.

+2

좋은 조언을 더 적절하지만 많은 임베디드 C++ 플랫폼은 돈 : 당신이로 nothrow를 사용하는 경우

또한 두 번째 하나를 사용할 수 있습니다 예외를 지원하고, 저 기억이 실제로 더 많은 관심사 인 것들이다. –

+0

"그러나 많은 임베디드 C++ 플랫폼은 예외를 지원하지 않습니다."그런 다음 C++을 지원하지 않고 C++과 유사한 언어를 지원합니다. 예외는 표준 C++의 일부입니다. – Raedwald

0
try { ptr = new unsigned car[num_bytes]; } 
catch(std::bad_alloc& e) { cerr << "error: " << e.what() << endl; } 

이 두 번째 관용구는 일반적으로 malloc

관련 문제