Избегайте станд.:: bad_alloc. новый должен возвратить Нулевого указателя

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

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

6
задан Roman Nikitchenko 18 February 2015 в 01:12
поделиться

5 ответов

You could overload operator new:

#include <vector>

void *operator new(size_t pAmount) // throw (std::bad_alloc)
{
    // just forward to the default no-throwing version.
    return ::operator new(pAmount, std::nothrow);
}

int main(void)
{
    typedef std::vector<int> container;

    container v;
    v.reserve(v.max_size()); // should fail
}
12
ответ дан 8 December 2019 в 13:46
поделиться

Просто попробуйте:

1. Определите функцию, которую вы хотите вызывать при нехватке памяти.

2. Передайте эту функцию set_ new _handler function, чтобы при новой не удается вызвать эту функцию.

1
ответ дан 8 December 2019 в 13:46
поделиться

Your compiler likely has a commandline switch to enable/disable this behaviour.

0
ответ дан 8 December 2019 в 13:46
поделиться

Извините, но, по моему мнению, вам НЕ следует сделайте это и вернитесь к старому новому поведению. Это потому, что вы просто не можете избежать исключений в любом случае.

ПОЧЕМУ?

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

Насколько я помню, в книге Скотта Мейерса Эффективный C ++ он подробно обсуждался. Но я не уверен, все ли случаи рассмотрены (но я предлагаю их достаточно).

1
ответ дан 8 December 2019 в 13:46
поделиться

Include the header . It contains a "no-throw" version of new you can use like this:

#include <new>

int main() {
    int* p = new(std::nothrow) int;
    if (p) {
        delete p;
    }
}

Edit: I admit I missed the last sentence of the question. But to be honest, I think that tweaking "plain new" to have pre-Standard behaviour isn't a good idea either. I'd look into some kind of automated search & replace to turn each new into new(std::nothrow).

3
ответ дан 8 December 2019 в 13:46
поделиться