Нужно ли откладывать какую-то аварийную память при сбое нового? - PullRequest
0 голосов
/ 24 сентября 2018

Предположим, у меня есть функция, которая использует "new", нужно ли мне выделить какую-то аварийную память в случае сбоя "new"?Например:

static char* emerg_mem = new char[EMERG_MEM_SZ];

FooElement* Foo::createElement()
{
    try
    {
        FooElement* ptr;
        ptr = new FooElement();
        return ptr;
    }
    catch(bad_alloc ex)
    {
        delete[] emerg_mem;
        emerg_mem = NULL;
        return NULL;
    }
}

Так, чтобы (EMERG_MEM_SZ) оставалось достаточно памяти для функций деструктора класса и т. Д., И для корректного выхода из программы?

Я использую GCC в Linux Mint, ноЯ полагаю, что этот вопрос может относиться к любой платформе.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я бы сказал нет.

Когда вашему приложению не хватает памяти и выдает исключение, стек начнет раскручиваться (таким образом, уничтожая и освобождая память по ходу дела).Как правило, деструкторы не должны использовать динамическое выделение памяти, скорее как они должны освобождать память.

Таким образом, если вы правильно использовали RAII, то вы вернете память обратно, когда стек раскручивается, что потенциально позволяет вамперехватить и продолжить (если выбрасывание - это отдельная задача, результаты которой могут быть отброшены).

Также в большинстве ситуаций ваше приложение замедлится до неиспользуемого сканирования задолго до фактического выброса исключения из памяти (как ОС).пытается объединить память, чтобы получить этот неуловимый слот).

0 голосов
/ 24 сентября 2018

Чтобы было достаточно памяти (EMERG_MEM_SZ) для функций деструкторов классов и т. Д., И для корректного выхода из программы?

Прежде чем пытаться выделить такую ​​память для деструкторов, вы должны сначалауметь аргументировать некоторые причины, по которым ваши деструкторы должны были бы выделять динамическую память в первую очередь.Такое требование - серьезный красный флаг в отношении дизайна класса.

Нужно ли откладывать какое-то аварийное запоминающее устройство при выходе из строя нового?

Не обязательно.Во-первых, изящный выход часто возможен без выделения динамической памяти.Во-вторых, программа, работающая в рамках защиты операционной системы, не обязательно должна корректно завершаться в такой ужасной ситуации, как нехватка памяти.


PS Некоторые системы (в частности, Linux, с определенной конфигурацией)) "перегрузить" память и никогда не выбрасывать std::bad_alloc.Вместо этого выделение всегда выполняется успешно, физическая память не выделяется до тех пор, пока к ней фактически не осуществляется доступ, и если в это время нет доступной памяти, процесс (или другой процесс) уничтожается для освобождения некоторой памяти.На такой системе в C ++ нет способа восстановиться после нехватки памяти.

...