Здравствуйте, 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? Вот в этом мой вопрос и состоял
Имхо перегрузка глобальных new\delete изврат
я бы попробовал вариации на тему
1 — закрыть new\delete определить для классов производящую функцию и возвращать smart_ptr, можно и просто указатель
плюс — компилер найдет все попыкти создать не так как ты хочешь
что-то в стиле
template <class T>
CustomizeNewDelete{
protected:
operator new
operator delete
public:
smart_ptr<T> Create(без параметров)
{
.........
}
};
class MyRealClass : public CustomizeNewDelete<MyRealClass>
{
public:
smart_ptr<MyRealClass> Create(с параметрами)
{
.........
}
}
для конструкторов без параметров обойдешься вообще только одним наследованием для всех классов.
для тех что с параметрами, ну придеться factory-method ов насоздавать или извратиться в CustomizeNewDelete
template<class T1>
smart_ptr<T> CustomizeNewDelete::Create(T1 t1)
{
.........
}
template<class T1,T2>
smart_ptr<T> CustomizeNewDelete::Create(T1 t1,T2,t2)
{
.........
}