Понимание этого немного вне темы к вопросу, но если Вы используете много хранимых процедур, удостоверьтесь, что существует последовательный способ подвергнуть их своего рода управлению исходным кодом (например, подрывная деятельность или мерзавец) и быть в состоянии переместить обновления от Вашей системы разработки до системы тестирования к производственной системе.
, Когда это сделано вручную без способа легко контролировать то, что - код то, где, это быстро становится кошмаром.
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
}
Просто попробуйте:
1. Определите функцию, которую вы хотите вызывать при нехватке памяти.
2. Передайте эту функцию set_ new _handler function, чтобы при новой не удается вызвать эту функцию.
Your compiler likely has a commandline switch to enable/disable this behaviour.
Извините, но, по моему мнению, вам НЕ следует сделайте это и вернитесь к старому новому поведению. Это потому, что вы просто не можете избежать исключений в любом случае.
ПОЧЕМУ?
Подумайте о новом вызове, который должен выделить класс с конструктором, вызывающим некоторый код инициализации, который должен создать что-нибудь временное, что является динамическим. Увы, у вас будет исключение. Независимо от того, используете ли вы std :: nothrow. Это только один сценарий среди многих из них.
Насколько я помню, в книге Скотта Мейерса Эффективный C ++ он подробно обсуждался. Но я не уверен, все ли случаи рассмотрены (но я предлагаю их достаточно).
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)
.