std::nothrow 는 상수이며, operator new의 인자이다. 동적 할당 시 할당이 불가능하게 되면, 프로그램이 죽지 않고 null pointer를 리턴하게 해준다.
일반적으로 new 오퍼레이터가 동적할 당을 실패하면 bad_alloc 예외가 발생하게 되는데, nothrow를 인자로 사용하면 할당 실패시 null pointer를 반환하게 된다.
(예외 처리 구문을 일일이 작성하지 않아서 좋을 듯 싶다)
<예시1>
// nothrow example
#include <iostream> // std::cout
#include <new> // std::nothrow
int main () {
std::cout << "Attempting to allocate 1 MiB... ";
char* p = new (std::nothrow) char [1048576];
if (!p) { // null pointers are implicitly converted to false
std::cout << "Failed!\n";
}
else {
std::cout << "Succeeded!\n";
delete[] p;
}
return 0;
}
/* 실행 결과 */
>> Attempting to allocate 1 MiB... Succeeded!
<예시2>
- 아래 예시에는 '예외 처리'를 사용하였다. 큰 메모리를 할당 하려고 해서 실패되고 포인터 p는 nullptr를 반환 받게 된다.
#include <iostream>
#include <new>
int main()
{
try {
while (true) {
new int[100000000ul]; // throwing overload
}
} catch (const std::bad_alloc& e) {
std::cout << e.what() << '\n';
}
while (true) {
int* p = new(std::nothrow) int[100000000ul]; // non-throwing overload
if (p == nullptr) {
std::cout << "Allocation returned nullptr\n";
break;
}
}
}
/* 실행 결과 */
>> std::bad_alloc
>> Allocation returned nullpt
출처)
반응형
'프로그래밍 언어 > C, C++' 카테고리의 다른 글
포인터 vs 참조자 (0) | 2022.11.15 |
---|---|
fstream 처음 위치로 옮겨서 덮어쓰기 (0) | 2022.02.27 |
C++ 파일 입출력 정리 (1) | 2022.02.14 |
Unit testing 이란 (0) | 2022.02.13 |
void 포인터 용법 정리 (0) | 2021.08.26 |