Где-то в RTL определены new/delete. Мне надо определить свои new/delete таким образом, что бы для моего кода гарантированно использовались мои new/delete. Для классов это просто. А вот как сделать, что бы и для обычных типов (char *a=new char[10] работало? Тулзы из RVCT 2.2, хотя хотелось бы платформеннонезависимого решения. Т.е. мне не очень понятно, как гарантировать, что бы в моем коде линкер взял именно мой new, а не библиотечный. Возможно как-то это сделать?
Re: переопределить new/delete для конкретного кода
Здравствуйте, Boom, Вы писали:
B>Где-то в RTL определены new/delete. Мне надо определить свои new/delete таким образом, что бы для моего кода гарантированно использовались мои new/delete. Для классов это просто. А вот как сделать, что бы и для обычных типов (char *a=new char[10] работало? Тулзы из RVCT 2.2, хотя хотелось бы платформеннонезависимого решения. Т.е. мне не очень понятно, как гарантировать, что бы в моем коде линкер взял именно мой new, а не библиотечный. Возможно как-то это сделать?
Стандартом С++ гарантируется, что при перегрузке глобальных операторов new и delete, будут использоваться именно перегруженные версии.
Re: переопределить new/delete для конкретного кода
Здравствуйте, Boom, Вы писали:
B>Где-то в RTL определены new/delete. Мне надо определить свои new/delete таким образом, что бы для моего кода гарантированно использовались мои new/delete. Для классов это просто. А вот как сделать, что бы и для обычных типов (char *a=new char[10] работало? Тулзы из RVCT 2.2, хотя хотелось бы платформеннонезависимого решения. Т.е. мне не очень понятно, как гарантировать, что бы в моем коде линкер взял именно мой new, а не библиотечный. Возможно как-то это сделать?
Мыло дай, зашлю пример.
Per Aspera Ad Astra
Re[2]: переопределить new/delete для конкретного кода
Здравствуйте, _INDY_, Вы писали:
_IN>Здравствуйте, Boom, Вы писали:
B>>Где-то в RTL определены new/delete. Мне надо определить свои new/delete таким образом, что бы для моего кода гарантированно использовались мои new/delete. Для классов это просто. А вот как сделать, что бы и для обычных типов (char *a=new char[10] работало? Тулзы из RVCT 2.2, хотя хотелось бы платформеннонезависимого решения. Т.е. мне не очень понятно, как гарантировать, что бы в моем коде линкер взял именно мой new, а не библиотечный. Возможно как-то это сделать?
_IN>Мыло дай, зашлю пример.
boom гав-гав kis точка-точка ru (в kis — одна 's')
Re[3]: переопределить new/delete для конкретного кода
Здравствуйте, Boom, Вы писали:
B>Здравствуйте, _INDY_, Вы писали:
_IN>>Здравствуйте, 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')
Отправил....
Per Aspera Ad Astra
Re[4]: переопределить new/delete для конкретного кода
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>Отправил....
Получил, спасибо! Однако присланый код несколько не о том Меня интересовала не собственно перегрузка new/delete, а... ммм... наличие нескольких разных new/delete в одной большой программе (утрированно, что бы каждый функционально законченый компонент имел свою пару new/delete)...
Немного поясню. Есть очень большая 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]; нигде не используются.
Сейчас в одном из компонентов хочется заюзать нормальные С++'ные механизмы, а, следовательно, для надежности надо перегрузить new/delete (конструкции вида char *p = allocator.allocate(10); использовать не хочется). Перегрузить-то я перегружу, но где гарантия, что я не напакостю другому компоненту? Или завтра другому компоненту не захочется так же перегрузить new/delete? Вот в этом мой вопрос и состоял
Re[5]: переопределить new/delete для конкретного кода
Здравствуйте, 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, определённого в глобальном пространстве имён. ИМХО.
Здравствуйте, 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)
{
.........
}
Re[6]: переопределить new/delete для конкретного кода
_IN>Ну например, определившись с набором компонент, которые используют одинаковый способ выделения памяти — эти компоненты можно определить в одном namespace и в этом же namespace определить соответствующий оператор new. Соответственно, при вызове компонентой Component1 опрератора new вызовется оператор который определён в этом же namespace. Если operator new нужен из другого пространства имен то его нужно явно указать namespace1::new или ::new для вызова оператора new, определённого в глобальном пространстве имён. ИМХО.
Здравствуйте, rm822, Вы писали:
R>Имхо перегрузка глобальных new\delete изврат R>я бы попробовал вариации на тему R>1 — закрыть new\delete определить для классов производящую функцию и возвращать smart_ptr, можно и просто указатель R>плюс — компилер найдет все попыкти создать не так как ты хочешь
Классы, наследуемые от аллокатора, в котором определены нужны new/delete — это классика Однако она не отвечает на вопрос, что делать с new/delete для фундаментальных типов
Здравствуйте, Boom, Вы писали:
B>Здравствуйте, rm822, Вы писали:
R>>Имхо перегрузка глобальных new\delete изврат R>>я бы попробовал вариации на тему R>>1 — закрыть new\delete определить для классов производящую функцию и возвращать smart_ptr, можно и просто указатель R>>плюс — компилер найдет все попыкти создать не так как ты хочешь
B>Классы, наследуемые от аллокатора, в котором определены нужны new/delete — это классика Однако она не отвечает на вопрос, что делать с new/delete для фундаментальных типов
ХЗ, а зачем создавать фундаментальные типы через new в с++?
для массивов есть вектор а нафиг нужен new int?
Здравствуйте, rm822, Вы писали:
R>Здравствуйте, Boom, Вы писали:
B>>Здравствуйте, rm822, Вы писали:
R>>>Имхо перегрузка глобальных new\delete изврат R>>>я бы попробовал вариации на тему R>>>1 — закрыть new\delete определить для классов производящую функцию и возвращать smart_ptr, можно и просто указатель R>>>плюс — компилер найдет все попыкти создать не так как ты хочешь
B>>Классы, наследуемые от аллокатора, в котором определены нужны new/delete — это классика Однако она не отвечает на вопрос, что делать с new/delete для фундаментальных типов
R>ХЗ, а зачем создавать фундаментальные типы через new в с++? R>для массивов есть вектор а нафиг нужен new int?
STL активно использует стек, что становится критичным для embedded платформ