본문 바로가기

프로그래밍 언어/C, C++

std::nothrow

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

 

출처)

https://cplusplus.com/reference/new/nothrow/

https://en.cppreference.com/w/cpp/memory/new/nothrow

반응형

'프로그래밍 언어 > 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