12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

поймать в месте вызова оператора. А еще можно вообще ничего не делатьи завершить программу с помощью abort или exit, что, собственно, мы исделали в примере. До этого момента мы все время говорили о глобальнойзамене оператора new, но определить специфичный код выделенияпамяти можно лишь для объектов определенного типа. Сделать этодостаточно просто, нужно лишь в каждом классе написать свои версииset_new_handler и new. Определенная в классе set_new_handler позволитпользователям задать обработчик new для класса, а принадлежащийклассу operator new гарантирует, что при выделении памяти для объектовэтого класса вместо глобального обработчика new будет использован тот,что определен в данном классе.Правильное оформление трюков — минус половинабаговnew_handler set_new_handler(new_handler p)throw();}Собственный new для классаclass Widget {public:static std::new_handler set_new_handler(std::new_handler p) throw();static void *operator new(std::size_t size)throw(std::bad_alloc);Как видно, new_handler — это typedef для указателя на функцию,которая не принимает никаких параметров, а set_new_handler —функция, которая как раз получает в качестве параметра переменнуютипа new_handler. Полученный указатель на функции впоследствиивызывается оператором new в случае неудачной попыткивыделения памяти. Предыдущий указатель на обработчик такжевозвращается (set_new_handler). В итоге можно получить примерноследующий код:Использование set_new_handlervoid outOfMem(){std::cerr

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!