std::nothrow
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
| Определено в заголовочном файле <new>
|
||
struct nothrow_t {}; |
(до C++11) | |
struct nothrow_t { explicit nothrow_t() = default; }; |
(начиная с C++11) | |
extern const std::nothrow_t nothrow; |
||
std::nothrow_t это пустой классовый тип, используемый для устранения неоднозначности перегруженных функций выделения памяти генерирующих или нет исключения. std::nothrow является его константой.
Пример
Запустить этот код
#include <iostream>
#include <new>
int main()
{
try
{
while (true)
{
new int[100000000ul]; // генерирующая перегрузка
}
}
catch (const std::bad_alloc& e)
{
std::cout << e.what() << '\n';
}
while (true)
{
int* p = new(std::nothrow) int[100000000ul]; // не генерирующая перегрузка
if (p == nullptr)
{
std::cout << "Распределение вернуло nullptr\n";
break;
}
}
}
Вывод:
std::bad_alloc
Распределение вернуло nullptr
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2510 | C++11 | конструктор по умолчанию был неявным, что могло привести к неоднозначности | сделан явным |
Смотрите также
| функции распределения памяти (функция) |