переопределить new/delete для конкретного кода
От: Boom Россия http://bcbdev.hypermart.net
Дата: 17.10.06 13:28
Оценка:
Где-то в RTL определены new/delete. Мне надо определить свои new/delete таким образом, что бы для моего кода гарантированно использовались мои new/delete. Для классов это просто. А вот как сделать, что бы и для обычных типов (char *a=new char[10] работало? Тулзы из RVCT 2.2, хотя хотелось бы платформеннонезависимого решения. Т.е. мне не очень понятно, как гарантировать, что бы в моем коде линкер взял именно мой new, а не библиотечный. Возможно как-то это сделать?
Re: переопределить new/delete для конкретного кода
От: Andrew_D  
Дата: 17.10.06 16:21
Оценка:
Здравствуйте, Boom, Вы писали:

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


Стандартом С++ гарантируется, что при перегрузке глобальных операторов new и delete, будут использоваться именно перегруженные версии.
Re: переопределить new/delete для конкретного кода
От: _INDY_ Россия  
Дата: 18.10.06 05:01
Оценка:
Здравствуйте, 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 для конкретного кода
От: Boom Россия http://bcbdev.hypermart.net
Дата: 18.10.06 08:53
Оценка:
Здравствуйте, _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 для конкретного кода
От: _INDY_ Россия  
Дата: 18.10.06 09:08
Оценка:
Здравствуйте, 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 для конкретного кода
От: Boom Россия http://bcbdev.hypermart.net
Дата: 18.10.06 09:50
Оценка:
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 для конкретного кода
От: _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
Re[5]: Не извращайся
От: rm822 Россия  
Дата: 18.10.06 10:43
Оценка:
Здравствуйте, 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 для конкретного кода
От: Boom Россия http://bcbdev.hypermart.net
Дата: 18.10.06 10:53
Оценка:
_IN>Ну например, определившись с набором компонент, которые используют одинаковый способ выделения памяти — эти компоненты можно определить в одном namespace и в этом же namespace определить соответствующий оператор new. Соответственно, при вызове компонентой Component1 опрератора new вызовется оператор который определён в этом же namespace. Если operator new нужен из другого пространства имен то его нужно явно указать namespace1::new или ::new для вызова оператора new, определённого в глобальном пространстве имён. ИМХО.

new/delete в namespace объявить нельзя
Re[6]: Не извращайся
От: Boom Россия http://bcbdev.hypermart.net
Дата: 18.10.06 10:55
Оценка:
Здравствуйте, rm822, Вы писали:

R>Имхо перегрузка глобальных new\delete изврат

R>я бы попробовал вариации на тему
R>1 — закрыть new\delete определить для классов производящую функцию и возвращать smart_ptr, можно и просто указатель
R>плюс — компилер найдет все попыкти создать не так как ты хочешь

Классы, наследуемые от аллокатора, в котором определены нужны new/delete — это классика Однако она не отвечает на вопрос, что делать с new/delete для фундаментальных типов
Re[7]: Не извращайся
От: rm822 Россия  
Дата: 18.10.06 11:14
Оценка:
Здравствуйте, Boom, Вы писали:

B>Здравствуйте, rm822, Вы писали:


R>>Имхо перегрузка глобальных new\delete изврат

R>>я бы попробовал вариации на тему
R>>1 — закрыть new\delete определить для классов производящую функцию и возвращать smart_ptr, можно и просто указатель
R>>плюс — компилер найдет все попыкти создать не так как ты хочешь

B>Классы, наследуемые от аллокатора, в котором определены нужны new/delete — это классика Однако она не отвечает на вопрос, что делать с new/delete для фундаментальных типов


ХЗ, а зачем создавать фундаментальные типы через new в с++?
для массивов есть вектор а нафиг нужен new int?
Re[8]: Не извращайся
От: _INDY_ Россия  
Дата: 18.10.06 11:33
Оценка:
Здравствуйте, 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 платформ
Per Aspera Ad Astra
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.