🔖

[C++] new実行時にbad_allocを起こしたくないならstd::nothrowを指定するとよい

に公開

C++でnewを使うとプログラムがヒープ上に動的にメモリが確保しにいくが、確保できる領域が無い場合std::bad_allocの例外が発生する。
そのため、newを使う各々の箇所でtry-catch処理を入れなければいけない。

int* ary;
try
{
  ary = new int[1000];
}
catch (const std::bad_alloc&)
{
  std::cout << "Allocation failed" << std::endl;
}

しかし全てのnewをしている箇所でtry-catchを入れるのは面倒なので調べていたところ、std::nothrowというキーワードをnew実行時に指定すれば例外が起きないということを知った。
std::nothrowを使い実装したコードは以下。

int* ary = new (std::nothrow) int[1000];
if (ary == nullptr)
{
  std::cout << "Allocation failed" << std::endl;
}

メモリ確保に失敗した場合、bad_allocの例外は発生せずnullptrがnewから返る。
そのためtry-catch処理は不要。
null判定してエラー処理してあげれば良いのでこちらの方がシンプルで良い。

Discussion