Re[5]: переопределить new/delete для конкретного кода
От: _INDY_ Россия  
Дата: 18.10.06 10:11
Оценка:
Здравствуйте, Boom, Вы писали:

B>>>>>Где-то в RTL определены new/delete. Мне надо определить свои new/delete таким образом, что бы для моего кода гарантированно использовались мои new/delete. Для классов это просто. А вот как сделать, что бы и для обычных типов (char *a=new char[10] работало? Тулзы из RVCT 2.2, хотя хотелось бы платформеннонезависимого решения. Т.е. мне не очень понятно, как гарантировать, что бы в моем коде линкер взял именно мой new, а не библиотечный. Возможно как-то это сделать?

_IN>>>>Мыло дай, зашлю пример.
B>>>boom гав-гав kis точка-точка ru (в kis — одна 's')
_IN>>Отправил....

B>Получил, спасибо! Однако присланый код несколько не о том Меня интересовала не собственно перегрузка new/delete, а... ммм... наличие нескольких разных new/delete в одной большой программе (утрированно, что бы каждый функционально законченый компонент имел свою пару new/delete)...


B>Немного поясню. Есть очень большая embeded система у которой свой специфический memory manager (ф-ии типа allocate(size), deallocate(ptr)). Стандартные C'шные malloc/free/new/delete вроде как просто враперы для allocate/deallocate, но уверенности, что это так сейчас и будет в дальнейшем нет (не спрашивайте почему, это мне не подвластно ). Эта большая система состоит из кучи функционально законченых компонент, которые пользуются allocate/deallocate. Все, в основном, написано на C. В немногочисленные вкраплениях C++ имеют перегруженные new/delete как члены классов. Глобально new/delete нигде не перегружены и конструкции вида char *p = new char[10]; нигде не используются.


B>Сейчас в одном из компонентов хочется заюзать нормальные С++'ные механизмы, а, следовательно, для надежности надо перегрузить new/delete (конструкции вида char *p = allocator.allocate(10); использовать не хочется). Перегрузить-то я перегружу, но где гарантия, что я не напакостю другому компоненту? Или завтра другому компоненту не захочется так же перегрузить new/delete? Вот в этом мой вопрос и состоял



Ну например, определившись с набором компонент, которые используют одинаковый способ выделения памяти — эти компоненты можно определить в одном namespace и в этом же namespace определить соответствующий оператор new. Соответственно, при вызове компонентой Component1 опрератора new вызовется оператор который определён в этом же namespace. Если operator new нужен из другого пространства имен то его нужно явно указать namespace1::new или ::new для вызова оператора new, определённого в глобальном пространстве имён. ИМХО.
Per Aspera Ad Astra
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.